乐趣区

关于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 查看这个问题 
退出移动版