函数建议命名规则:动词+名称;避免不必要的缩写(printError优于printErr);避免使用类型关键字;使用习惯用语(init表示初始化,is/has返回布尔值);用反义词命名行为相反的函数
33. 不管是指针、引用类型还是其天涯类型参数,都是值拷贝传递,区别在于拷贝的目标对象
34. 指针传递坏处在于延长该变量的声明周期,也可能导致他分配到堆上增加性能消耗
35. 函数参数在函数内部有效,作用域是整个函数内部
36. 变参 func test(a ...int){} test(a[:]...) 持跨行;允许字节数组访问,单不允许字节数组取地址
46. 用切片指向数组时,底层还是指向该字符串
47. range遍历可以打印出汉字,len遍历出的汉字是乱码
48. append可以向[]byte追加 =》var bs []byte bs=append(bs,"abc"...)
49. 字符串加法运算每次都会重新分配内存,构建大字符串性能极差;方法1:strings.Join 方法2:bytes.Buffer 小字符串拼接使用fmt.Sprintf text/template等
50. utf8.RuneCountInString(s)代替len获取带汉字的字符串长度
51. 长度是数组的类型组成部分,元素类型相同长度不同的数组不是同一类型
52. 多维数组,只第一维支持... => [...][10]
53. 如果元素支持== !=操作,则数组也支持
54. 数组是值类型
55. 切片:不是动态数组或数组指针;内部通过指针引用底层数组,设定相关属性将数据读写操作限定在指定区域内。可以理解为数组指针的包装
56. 切片本身是只读对象,工作机制类似数组指针的包装 右半开区间 数组必须addressable