go语言变量必须使用 go语言定义全局变量

golang变量(二)——map和slice详解衍生类型,interface{} , map, []  , struct等
map类似于java的hashmap,python的dict,php的hash array 。
常规的for循环,可以用for k,v :=range m {}. 但在下面清空有一个坑注意:
著名的map[string]*struct 副本问题
结果:
Go 中不存在引用传递 , 所有的参数传递都是值传递 , 而map是等同于指针类型的,所以在把map变量传递给函数时,函数对map的修改,也会实质改变map的值 。
slice类似于其他语言的数组(list,array),slice初始化和map一样,这里不在重复
除了Pointer数组外 , len表示使用长度 , cap是总容量,make([]int, len, cap)可以预申请 比较大的容量 , 这样可以减少容量拓展的消耗,前提是要用到 。
cap是计算切片容量,len是计算变量长度的,两者不一样 。具体例子如下:
结果:
分析:cap是计算当前slice已分配的容量大小,采用的是预分配的伙伴算法(当容量满时,拓展分配一倍的容量) 。
append是slice非常常用的函数,用于添加数据到slice中,但如果使用不好,会有下面的问题:
预期是[1 2 3 4 5 6 7 8 9 10] ,  [1 2 3 4 5 6 7 8 9 10 11 12],但实际结果是:
注意slice是值传递,修改一下:
输出如下:
== 只能用于判断常规数据类型,无法使用用于slice和map判断,用于判断map和slice可以使用reflect.DeepEqual,这个函数用了递归来判断每层的k,v是否一致 。
当然还有其他方式,比如转换成json,但小心有一些异常的bug,比如html编码 , 具体这个json问题,待后面在分析 。
Go语言和其他语言的不同之基本语法Go语言作为出现比较晚的一门编程语言,在其原生支持高并发、云原生等领域的优秀表现,像目前比较流行的容器编排技术Kubernetes、容器技术Docker都是用Go语言写的 , 像Java等其他面向对象的语言 , 虽然也能做云原生相关的开发,但是支持的程度远没有Go语言高,凭借其语言特性和简单的编程方式 , 弥补了其他编程语言一定程度上的不足,一度成为一个热门的编程语言 。
最近在学习Go语言,我之前使用过C#、Java等面向对象编程的语言 , 发现其中有很多的编程方式和其他语言有区别的地方,好记性不如烂笔头,总结一下,和其他语言做个对比 。这里只总结差异的地方,具体的语法不做详细的介绍 。
种一棵树最好的时间是十年前,其次是现在 。
3)变量初始化时候可以和其他语言一样直接在变量后面加等号,等号后面为要初始化的值,也可以使用变量名:=变量值的简单方式
3)变量赋值 Go语言的变量赋值和多数语言一致,但是Go语言提供了多重赋值的功能,比如下面这个交换i、j变量的语句:
在不支持多重赋值的语言中 , 交换两个变量的值需要引入一个中间变量:
4)匿名变量
在使用其他语言时,有时候要获取一个值,却因为该函数返回多个值而不得不定义很多没有的变量,Go语言可以借助多重返回值和匿名变量来避免这种写法,使代码看起来更优雅 。
假如GetName()函数返回3个值 , 分别是firstName,lastName和nickName
若指向获得nickName,则函数调用可以这样写
这种写法可以让代码更清晰 , 从而大幅降低沟通的复杂度和维护的难度 。
1)基本常量
常量使用关键字const 定义 , 可以限定常量类型,但不是必须的,如果没有定义常量的类型,是无类型常量
2)预定义常量
Go语言预定义了这些常量 true、false和iota

推荐阅读