golang新手不注意可能会出现的一些小问题

  

  

<>强语言哲学

  

C语言是纯过程式的,这和它产生的历史背景有关. java语言则是激进的面向对象主义推崇者,典型表现是它不能容忍体系里存在孤立的函数。而去语言没有去否认任何一方,而是用批判吸收的眼光,将所有编程思想做了一次梳理,融合众家之长,但时刻警惕特性复杂化,极力维持语言特性的简洁,力求小而精
  

  

去语言反对函数和操作符重载(超载),而c++、Java和c#都允许出现同名函数或操作符,只要它们的参数列表不同。
  

  

其次,语言支持类,类成员方法,类的组合,但反对继承,反对虚函数(虚函数)和虚函数重载。确切地说,去也提供了继承,只不过是采用了组合的文法来提供

  

最近在整理之前写程序,学习时所记录的有道云笔记,发现一些有意思的小点跟大家分享一下。如有错误请大家给指出

  

  

闭包(匿名函数)

        函数测试(){   我,n=1, 2;   推迟func (int) {   fmt。Println(”,推迟:“n);//n被闭包引用   }(i)//复制我的值   我n=+ 1, n + 2;   fmt。Println (n);   }      

我们看一下结果:

        2 4   推迟:1 4      

为什么会这样?是因为闭包复制的是原对象指针,出现了延迟引用现象。我们在使用闭包的时候要注意这个问题,同样的在循环中也会出现类似现象。

  

  

前一段时间在论坛看到一个问题

        类型数据结构{   AABB [2] float64   }   var m map [string] Data=https://www.yisu.com/zixun/make (map [string]的数据,1)   m (“xxx”)={}数据   米(“xxx”) .AABB [0]=1.0   m (“xxx”) .AABB [1]=2.0 & lt; br过滤数据=肮恕弊4?以上代码去构建通不过,错误提示不能分配到m [“xxx”] .AABB [0]      

这是一个网友给出的答案

        类型数据结构{   AABB [2] float64   }   m:=(map [string] *数据,1)   m (“xxxx”)={}数据   m (“xxxx”)。AABB [0]=1.0   m (“xxxx”)。AABB [1]=2.0   #这样写就对了,你的m (“xxxx”)返回的是值,不是一个可取地址的变量      

这个网友的答案可以编译成功,但是不可取,他犯了很多新手都容易出现的问题

  

为什么? Golang中的图元素属性被设计为只读的,并不期望被修改,并且从地图中取回的是一个价值也是临时复制品,并且地图是一个散列结构,当散列扩容时,键值的存储位置就会发生改变。如果这个时候我们对m (“xxxx”)。AABB[0]=1.0修改,不知道指针会发什么大。家有兴趣可以看看走Hashmap内存布局和实现

  

如果我们想修改最好这样

        类型数据结构{   AABB [2] float64   }   m:=(map [string] *数据,1)   m=(“xxxx”),数据{}   d:=m (“xxxx”)   d。AABB [0]=1.0   d。AABB [1]=2.0   米(“xxxx”)=d      

  

先看一段代码,当然这种场景不常见,但是能让我们更好的理解nil

        函数t () {   var我* int=零;   var n接口{}=我;   fmt.Println (n==nil);//错误   }      

可能很多小伙伴都会有疑问都是零为啥会不相等。我们先分别看一下指针,界面的结构体和当指针,界面为空时的结构

        uintptr   interfaceStruct struct类型{   v * _value//实际值   t * _type//实际值的类型信息   }   uintptr(0)==零   interfaceStruct struct类型{   v: uintptr (0)   t: uintptr (0)   }==nil      

由此我们可以看出零其实就是指针接口的零值

  

这时候我们在来解释为啥为误就很容易了

        函数t () {   var我* int=零;//(* int)零   var n接口{}=我;//interace {} ((* int) nil)   fmt.Println (n==nil);//类型interfaceStruct struct {//v: uintptr (0)//t: int (*)//}   }      

官方文档规定可以为零的类型还有片、地图、频道功能。

  

可能有些朋友可能会问为啥没有错误类型,那是因为错误只是程序预设的接口方法,犯错nil也会出现类似的问题,官方有一个文档也给出了解释,传送门

        {类型错误界面   错误()字符串   }      

golang新手不注意可能会出现的一些小问题