zoukankan      html  css  js  c++  java
  • 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。
     

  • 相关阅读:
    虚拟机调用本机数据库发生错误
    VS2010添加虚拟机发布的WebService引用
    IIS发布错误及解决
    JSON.parse()与JSON.stringify()的区别
    数组去重
    React性能优化 PureComponent
    JS逻辑题 技术点: 1). 变量提升 2). 函数提升 3). 预处理 4). 调用顺序
    React组件间信息传递方式
    css/css3实现未知宽高元素的垂直居中和水平居中
    关于setTimeout的一个逻辑题
  • 原文地址:https://www.cnblogs.com/chongyao/p/13930561.html
Copyright © 2011-2022 走看看