大佬教程收集整理的这篇文章主要介绍了golang 坑集,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
func main() { x := 1 defer func(a int) { fmt.Println("a=",a) }(X) defer func() { fmt.Println("x=",X) }() x++ }
结果:x=2a=1
说明:defer 调用所需参数在 defer 语句执行时就被已计算好了 (拷贝传递),闭包内则是引用,defer执行顺序FIFO
数组和slice
数组是值类型 slice是引用类型,
数组的创建 arr:=[...]int{1,2,3} arr:=[3]int{} arr:=new([10]int) (注意new返回的是[10]int的指针类)
slice的创建 slice:=[]int{1,3} slice:=arr[n:m]( n <= x < m) slice:=make([]int,len,[cap]) (cap default=len)
每个slice指向了一个底层数组,对slice的更新会反映到这个底层数组上,cap=slice在数组的start_index到数组的end_index
reslice slice1:=slice2[n:m] 在slice进行reslice时如果n,m超过了cap 不会引发底层数组的重分配 ,而会panic: runtime error: index out of range
append(s1,1,3) 可以引发底层数组重分配 增加一个cap
copy(dst,srC) len=min(len(dst),len(srC))
map
d := map[*int]struct{ x,y float64 } { &10: { 1.0,2.0 } }
struct 和数组一样 也是值类型
type s1 struct { s2 struct { a int } } func main() { m := map[int]struct{ a int }{1: {1}}//正确 fmt.Println(m) s := s1{{1}}//异常 missing type in composite literal fmt.Println(s) }匿名struct可以作为map的value而且赋值方便,而匿名struct作为struct的成员则在初始化时 需要带上struct的名字才行,成员变量 匿名struct 就不方便了。
struct拷贝复制
u := User{ 100,"Tom" } var u2 *User = new(User) *u2 = u
匿名成员 (组合优于继承)
type D1 struct { x int } type Data struct { D1 x int } func main() { d := Data{D1{10},20} d.x = 200 d.D1.x = 100 fmt.Println(d) }
接口类型推断
if o,ok:=i.(User);ok{ o.xxx } switch o:=i.(typE){ case User: xxx case Man: xxx }
将对象赋值给接口变量时,会发发生值拷贝行为
u := User{ 1,"Tom" } i := Tester(u)//强制转换 赋值发生的是copy动作 //在golang里要千万注意 = 这个赋值动作 都是copy动作,如果copy的对象是个指针的话性能会比较好 u.id = 100 // 显式修改的原对象 u.Name = "Jack" fmt.Println(u,i) // 虽然接⼝口内的复制品未受到影响
以上是大佬教程为你收集整理的golang 坑集全部内容,希望文章能够帮你解决golang 坑集所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。