go的值类型和引用类型1——传递和拷贝


本文摘自网络,作者,侵删。

首先,我们了解一些基本概念。
值类型:基本数据类型,数组,结构体,接口。
引用类型:map,slice,channel,func,指针。

函数调用时,传参数的方式:
值传递:拷贝值,递给函数的是变量的副本。
引用传递:拷贝指针,递给函数的是变量的指针。

函数内部,给新变量赋值的时候:
深拷贝:拷贝值,也叫值拷贝。
浅拷贝:拷贝指针。

拷贝规则:值类型一般都是深拷贝,引用类型都是浅拷贝。
传递规则:go里面都是值传递。

注意:切片在一定条件下也是值拷贝。
注意:针对结构体类型的变量,如果里面有指针字段。发生了拷贝,新变量的指针字段和源变量的指针字段指向相同的地址空间。
注意:如果结构体中有锁的话,记得重新初始化一个锁对象,否则会出现非预期的死锁,案例:

type User struct {
     mut sync.Mutex
     name string
 }

 func main() {
     u1 := &User{name: "test"}
     u1.Lock()
     defer u1.Unlock()
     tmp := *u1
     u2 := &tmp
     // u2.Mutex = sync.Mutex{} // 没有这一行就会死锁
     fmt.Printf("%#p\n", u1)
     fmt.Printf("%#p\n", u2)
     u2.Lock()
     defer u2.Unlock()
 }

$ go run test.go
c00000c060
c00000c080
fatal error: all goroutines are asleep - deadlock!

可以使用go vet test.go检查这个问题

本文来自:Segmentfault

感谢作者:煮酒

查看原文:go的值类型和引用类型1——传递和拷贝

相关阅读 >>

Gocn酷Go推荐】Go程序配置利器-viper库

Go语言指针作为函数参数

聊聊dubbo-Go-proxy的remotefilter

Go1.4 bootstrap 源码安装新版Go

关于Golang里的future/promise

总结 Go 的数据类型

使用gin封装一个web脚手架(五):实现session(上)

写在 dubbo Go 的第五个年头

关于Golang切片的三种简单使用方式及区别

Golang中main中panic和后续panic处理,以及新开协程的影响

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...