计算机中变量是一段或者多段用来存储数据的内存,类型决定变量内存的长度和存储格式,所以我们只能修改变量值不能修改类型
-
内存分配发生在运行时,编译后的机器码不使用变量名而是直接使用内存地址访问目标数据,所以编码阶段采用易于阅读的变量名
-
惯例建议以组的方式整理多行变量定义 var {x,y int } type{ xxx }
-
简短声明一般用于函数多返回值,以及if for switch等语句中定义局部变量
-
未使用的局部变量会编译出错,全局变量不报错
-
命名建议字母或下划线开始,多字母数字和下划线组合,局部变量优先短名
-
常量实在预处理阶段展开成指令数据,变量是在运行期分配存储内存.(所以常量无法寻址,没有地址)
-
byte是uint8的别名 rune是int32的别名 别名直接可以相互赋值不需要类型转换
-
拥有相同的底层结构不代表就属于别名
-
new为指定类型分配零值内存返回指针;make是引用类型专用的创建函数(内存分配和属性初始化)new为指定类型分配零值内存返回指针;make是引用类型专用的创建函数(内存分配和属性初始化)
-
未命名类型:数组、切片、字典、通道等类型与具体元素类型或长度等属性相关的类型,可以用type将其改变成命名类型
-
对于未命名类型 struct tag不同也属于不同类型,字段顺序不同也属于不同类型。
-
乘幂和绝对值运算在math包的Pow和Abs中
-
自增自减只能作为独立语句
-
指针是实体会分配内存空间,内存地址是内存中每个字节单元的唯一编号
-
指针类型指向相同地址或nil则相等,但是不能做加减和类型转换
-
unsafe.Pointer将指针转换为uintptr进行加减运算,但可能造成非法访问
-
指针不能用->,统一使用.
-
复合类型初始化,必须包含类型标签;左花括号必须在类型尾部;多成员都好隔开;多行右侧必须是逗号或者花括号
-
switch 无需显式执行break,但是想顺序执行需要显式执行fallthrough
-
range迭代是复制数据
-
goto只能跳转到同级代码,不能跨级别
-
break用于switch for select,终止整个语句块执行
-
continue只用于for循环,终止后续逻辑立即进入下一轮循环
-
函数无需前置声明;不支持命名嵌套定义;不支持同名重载;不支持默认参数;支持不定长参数;支持多返回值;支持命名返回值;支持匿名函数和闭包切片引用数组时,切片指针会指向数组地址;访问越界会报错;append会追加数组,当长度大于cap时会重新分配地址,则切片和数组就相互独立了
-
切片 var a[]int 为nil,仅代表他为初始化,但依旧分配内存;且a[:]依旧是nil
-
如果切片长时间占用大数组的少量数据,建议切片单独分配地址,以让大数组尽早释放
-
可将字符串直接复制到[]byte => b:=make([]byte,3) n:=copy(b,"abcdefhg")=>n=3,b=[97 98 99]
-
字典的key必须支持== != 如数字、字符串、指针、数组、结构、接口
-
if v,ok:=m["d"];ok{存在} 使用ok-idiom模式判断key是否存在
-
delete(m,"d"),删除不存在的key不报错
-
map使用range迭代每次顺序不定
-
map被设计成 no addressable,所有没法修改value的成员(如果value是个结构或者数组等) ;改进方法1:先获取完整value,修改后再赋值回去;方法2:value采用指针类型。因为value是指针,所有可以通过指针修改指针指向的数据。
-
map并发操作,某任务针对map写操作,其他任务对该map的读写删除都会导致进程崩溃;可用sync.RWMutex实现同步(不要使用defer)
-
map对象本身就是指针包装,传参不需要取地址
-
map创建时和slice一样要预选分配足够地址,减少扩张时不必要的内存分配和重新哈希操作=>make(map[int]int,1000)
-
对于海量小对象,应该直接用字典存储键值数据拷贝而不是指针,这样减少扫描对象的数量缩短垃圾回收时间。
-
字典不会收缩内存,适当替换新对象是有必要的
-
结构推荐命名初始化,以防扩充结构时报错 匿名结构:
1 2 3 4 5 u:=struct{ name string }{ name:"xxx", } 72. 只有所有成员都支持==操作时,结构才支持相等操作
-
匿名字典隐式的以类型名为字段名称,使用时可以直接饮用匿名字段的成员,但是初始化时必须当做独立字段。(但是隐式字段是外部类型的话,隐式名称不包含包名)
-
除接口指针 多级指针外的任何命名类型都可作为匿名类型
-
字段标签是对字段描述的元数据,是类型的组成部分;运行期间可用反射获取标签信息,通常作为格式校验和数据库关系映射等