go 随便学习笔记

go的学习笔记
# new 和make 的区别
new - 用于分配内存 , 返回指针。 分配的空间被清零。 创建map时需要进行初始化才能使用。
make - 只能用于 slice 、map 、channel 的初始化 ,返回指针指向的值。 进行初始化。

func main(){
countryCapitalMapBynew := new(map[string]string)
*countryCapitalMapBynew = map[string]string{"France": "巴黎"}
/* map插入key - value对,各个国家对应的首都 */ 
(*countryCapitalMapBynew)["American"] = "华盛顿"
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
countryCapitalMap["Italy"] = "罗马"
}

# 扩展函数的定义

type tree struct {
v int
l *tree
r *tree
}

func (t *tree) Sum() int {

if t == nil {
return 0
}
return t.v + t.l.Sum() + t.r.Sum()
}
treeList := &tree{ init }
使用 treeList.Sum()

# Slice 切片 表示数组的抽象。 包含三部分 ptr ,len ,cap
make([]T, length, capacity) /*capacity 为可选参数*/
可以通过len() 获取切片长度
可以通过cap() 可以测量最长可以达到多少
append() 在slice 尾部添加元素
copy(slice1 ,slice2) 函数将slice2拷贝到slice1 但是不会超出slice1 定义的长度。例如

func main() {
arr1 := make([]int, 10)
arr1 = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
printSlice(arr1)
slice2 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
printSlice(slice2)
slice2 = append(slice2, 1, 2, 3, 45, 6, 7)
printSlice(slice2)
copy(arr1, slice2)
printSlice(arr1)
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v
", len(x), cap(x), x)
}

 关于appen 扩容策略 

首先判断,如果新申请容量(cap)大于2倍的旧容量(old.cap),最终容量(newcap)就是新申请的容量(cap)。
否则判断,如果旧切片的长度小于1024,则最终容量(newcap)就是旧容量(old.cap)的两倍,即(newcap=doublecap),
否则判断,如果旧切片长度大于等于1024,则最终容量(newcap)从旧容量(old.cap)开始循环增加原来的1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最终容量(newcap)大于等于新申请的容量(cap),即(newcap >= cap)
如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)。

  

# 关于切片 对数组进行切片操作之后再append操作 。 切片的cap 为 arrcap+append.count ,使用切片表达式当设置的值大于len小于cap 多出来的值会以默认形式补齐(例如 int 为0)。示例代码

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    fmt.Printf("s:%v len(s):%v cap(s):%v
", a, len(a), cap(a))
    // a = append(a, 1)
    s := a[:3] // s := a[low:high]
    fmt.Printf("before: s:%v len(s):%v cap(s):%v
", s, len(s), cap(s))
    s = append(s, 0, 1, 2, 3, 4, 5, 6, 7)
    fmt.Printf("end: s:%v len(s):%v cap(s):%v
", s, len(s), cap(s))
    // fmt.Printf("&s:%v 
", &s)
    s2 := s[:12] // 索引的上限是cap(s)而不是len(s)
    fmt.Printf("s2:%v len(s2):%v cap(s2):%v
", s2, len(s2), cap(s2))
}


# 全局变量可以和局部变量重名。作用域内优先使用局部变量。
# 关于range 关键字 。类似 c# foreach 。常用语循环 array 、slice 、channel、map。
 

原文地址:https://www.cnblogs.com/chongyao/p/13930561.html