比尔萄堡

上帝说: “要有光” 于是,就有了光。


  • 首页

  • 归档

  • 关于我

  • 公益404

  • 搜索

值传递 and 引用传递

时间: 2022-08-11 分类: Golang   字数: 362 字 阅读: 1分钟 阅读次数:

值传递

golang都是值传递,没有引用传递。 看起来像是引用传递的,其实也是对指针地址进行了copy。

func changIntValue(x *int) {
	*x = 2 // Whatever variable caller passed in will now be 2
	y := 7
	x = &y // has no impact on the caller because we overwrote the pointer value!
}

传入一个*int,结果值是2.

再看一个slice和type的例子:

package main

import "fmt"

type EType struct {
	A int
}

func main() {
	a := []int{1, 2, 3}
	changeSlice(a)
	b := a
	a[2] = 4
	fmt.Printf("%T, %v, %p, %p \n", a, a, a, &a)
	fmt.Printf("%T, %v, %p, %p \n", b, b, b, &b)

	t := EType{A: 1}
	fmt.Println("type example: ", t)
	changeStruct(t)
	fmt.Println("type example after change: ", t)

}

func changeSlice(s []int) {
	fmt.Printf("inner changeSlice: %T, %v, %p, %p \n", s, s, s, &s)
	s[0] = 5
}
func changeStruct(t EType) {
	t.A = 10
}
//inner changeSlice: []int, [1 2 3], 0xc000018018, 0xc000010048 
//[]int, [5 2 4], 0xc000018018, 0xc000010030 
//[]int, [5 2 4], 0xc000018018, 0xc0000100a8 
//type example:  {1}
//type example after change:  {1}

for range改动不生效的问题

for range这有个坑,生成的变量是值传递,会在loop完成后,进行销毁回收,展示下错误用法

var tmp yyyType
for _, item := range slice {
    item.xxx = xxx
    tmp = &item
}

结果是item值没有改变,tmp指向空值

正确用法:

var tmp yyyType
for idx, item := range slice {
    slice[idx].xxx = xxx
    tmp = &slice[idx]
}

Passing by reference and value in Go to functions

#golang# #值传递#

标题:值传递 and 引用传递

作者:训导主任林作栋

声明: 本博客文章除特别声明外,均采用 CC BY-NC-SA 3.0许可协议,转载请注明出处!

创作实属不易,如有帮助,那就打赏博主些许茶钱吧 ^_^
WeChat Pay

微信打赏

Alipay

支付宝打赏

utf-8与unicode
前端部署流程优化- 打包篇
训导主任林作栋

训导主任林作栋

戏谑的码农,北野武的拥趸,李安的迷弟,伍佰的Fans

55 日志
23 分类
62 标签
豆瓣
友情链接
  • Obsidian
  • V2EX
  • 关注黑客与极客
  • 廖雪峰
标签云
  • Linux 6
  • K8s 5
  • 数据库 5
  • Golang 4
  • Etcd 3
  • Mysql 3
  • Ai 2
  • Gitlab 2
  • Postgres 2
  • 前端 2
© 2010 - 2024 比尔萄堡
Powered by - Hugo v0.58.2 / Theme by - NexT
/
Storage by Vercel / 刘 ICP 备 18047355 号
0%