go简介
语言哲学
C语言是纯过程式的,这和它产生的历史背景有关。Java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而Go语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精
Go语言反对函数和操作符重载(overload),而C++、Java和C#都允许出现同名函数或操作符,只要它们的参数列表不同。
其次,Go语言支持类、类成员方法、类的组合,但反对继承,反对虚函数(virtual function)和虚函数重载。确切地说,Go也提供了继承,只不过是采用了组合的文法来提供
最近在整理之前写程序,学习时所记录的有道云笔记,发现一些有意思的小点跟大家分享一下。如有错误请大家给指出
一、闭包 defer
闭包(匿名函数)
func test(){ i, n := 1 ,2; defer func(a int){ fmt.Println("defer:", a , n); //n被闭包引用 }(i) //复制i的值 i , n = i+1,n+2; fmt.Println(i , n); }
我们看一下结果:
2 4 defer: 1 4
为什么会这样?是因为闭包复制的是原对象指针,出现了延迟引用现象。我们在使用闭包的时候要注意这个问题,同样在for 循环中 也会出现类似现象。
二、Map
前一段时间在论坛看到一个问题
type Data struct{ AABB [2]float64 } var m map[string]Data = make(map[string]Data,1) m["xxx"] = Data{} m["xxx"].AABB[0]=1.0 m["xxx"].AABB[1]=2.0<br data-filtered="filtered">#以上代码go build 通不过,错误提示cannot assign to m["xxx"].AABB[0]
这是一个网友给出的答案
type Data struct{ AABB [2]float64 } m := make(map[string]*Data,1) m["xxxx"] = Data{} m["xxxx"].AABB[0] = 1.0 m["xxxx"].AABB[1] = 2.0 #这样写就对了,你的 m["xxxx"] 返回的是值,不是一个可取地址的变量
这个网友的答案可以编译成功,但是不可取,他犯了很多新手都容易出现的问题
why?Golang中的map元素属性被设计为只读的,并不期望被修改,并且从 map 中取回的是一个value也是临时复制品。并且map是一个hash 结构,当hash扩容时,键值的存储位置就会发生改变。如果这个时候我们对 m["xxxx"].AABB[0] = 1.0 修改,不知道指针会发什么。大家有兴趣可以看看Go Hashmap内存布局和实现
如果我们想修改最好这样
type Data struct{ AABB [2]float64 } m := make(map[string]*Data,1) m["xxxx"] = &Data{} d := m["xxxx"] d.AABB[0] = 1.0 d.AABB[1] = 2.0 m["xxxx"] = d
三、nil
先看一段代码,当然这种场景不常见,但是能让我们更好的理解nil
func t(){ var i *int = nil; var n interface{} = i; fmt.Println(n==nil); //false }
可能很多小伙伴都会有疑问都是nil 为啥会不相等。我们先分别看一下pointer,interface的结构体和当pointer,interface为nil时的结构
uintptr type interfaceStruct struct { v *_value // 实际值 t *_type // 实际值的类型信息 } uintptr(0) == nil type interfaceStruct struct { v:uintptr(0) t:uintptr(0) } == nil
由此我们可以看出nil其实就是指针 interface的零值
这时候我们在来解释为啥为flase就很容易了
func t(){ var i *int = nil; // (*int)nil var n interface{} = i; // interace{}((*int)nil) fmt.Println(n==nil); // type interfaceStruct struct { // v: uintptr(0), // t: (*int) // } }
官方文档规定可以为nil的类型还有 slice ,map ,channel ,function 。
可能有些朋友可能会问为啥没有error类型,那是因为error 只是程序预设的接口方法, err nil 也会出现类似的问题,官方有一个文档也给出了解释,传送门
type error interface { Error() string }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]