关于golang: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查看这个问题

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理