• Go基础学习【2】


    一:数组

    1.命名
    var arrAge = [5]int{1,2,3,4,5}
    var arrAge =[…]int{1,2,4,5,6}
    var arrAge =[5]string{3:“sfd”,5:“asdf”}
    2.传递
    通过传递数组的指针 和 使用数组的切片 来防止数组传递给函数消耗的内存
    3.切片

    切片的定义;
    make([]int,50,50)
    new([100]int)[0:50]
    
    • 1
    • 2
    • 3

    切片是一个可变的数组,在 Go 代码中 切片比数组更常用。不可以将指针只想切片,因为切片本身就是一个指针了,使用make创建切片切片拥有长度和容量。
    切片的长度是它所包含的元素个数。
    切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。

    make([]int, len,cap)  //50表示长度,cap可写可不写  
    new([100]int)[0:50]   //这两种方法表示IDE是一样的
    var v [] int = make([]int,10,50) 等价于 v:make([]int,10,50)
    
    • 1
    • 2
    • 3

    第一种适用于 map 切片 和channel
    第二种使用于 数组 结构体
    切片依旧适用for range格式 来进行遍历
    切片的复制和添加
    添加的第一种方式:copy() copy(s1.s2) 将s2内容拷贝到s1中也可以作为添加来说
    添加的第二种方式:append(s1,s2) 将s2添加到s1尾部
    4、切片的应用
    修改某个字符的时候,首先将其转化为byte类型,然后进行字符修改,然后在将其从字符转化为字符串

    s := "hello"
    c := []byte(s)
    c[0] = 'c'
    s2 := string(c) // s2 == "cello"
    
    • 1
    • 2
    • 3
    • 4

    二:map集合

    使用make来构造map,不要使用new,如果map中新增容量,那么容量会自动增加,但是还是提前标出容量为好

    var map1 map[keytype]valuetype  //定义形式
    var map1 map[string]int   //定义形式
    赋值形式:一种是根据键定值
    第二种形式如下:
    noteFrequency := map[string]float32 {
        "C0": 16.35, "D0": 18.35, "E0": 20.60, "F0": 21.83,
        "G0": 24.50, "A0": 27.50, "B0": 30.87, "A4": 440}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    map类型的切片:

    定义:
    make([]map[string]int])
    
    • 1
    • 2

    使用两层make,第一层make是定义切片,第二层make是定义map里的元素
    map的排序:将键或者值拷贝到一个切片,可以借助切片中的sort方法来进行排序,然后使用for-range输出

    三:包

    1.上锁
    线程占用问题,多个不同线程访问同一个变量的时候有顺序问题,可以通过对变量的上锁和解锁来防止资源竞争

    func Update(info *Info) {
        info.mu.Lock() //上锁
        info.Str = // new value //赋值
        info.mu.Unlock() //解锁
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    还可以通过RWMutex锁:RLock() 同一时间内允许多个线程同时访问,但是只有一个线程能够进行写操作
    2.自定义包
    创建新包并引入时 注意的是首字母大写的变量名和函数才属于共有的,其他都是私有的

    四:结构体

    格式定义

    type identifier struct{
        field1 type1
        field2 type2
    }
    type T  struct{a , b int}
    var t * T  //变量t是指向T的一个指针
    t:=new(T) //给t分配内存,并零值化内存
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结构体的匿名字段:定义结构体时。只定义了类型,没有定义字段名

    普通结构体:
    type hello struct{
        name sting
        a int
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    匿名结构体:

    type hello struct{
        int 
        string
    }
    
    • 1
    • 2
    • 3
    • 4

    值类型的接收者和指针类型的接收者区别:
    指针类型的接受者在改变之后,变量的值发生改变;而值类型的接收者在改变变量的值后,变量的值没有是不受影响的,只有go复制出来的副本受其影响
    在需要改变值的时候或拷贝代价较大时候以及为了维持一致性,使用指针类型接收者
    当嵌套字段名发生冲突的时候,为了避免冲突,需要具体到具体结构体和方法

    user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime
    user3.Email.CreateTime = "2000"   //指定Email结构体中的CreateTime
    
    • 1
    • 2

    可以通过直接命名方式对结构体进行赋值:

    d1 := &Dog{
       Feet: 4,
       Animal: &Animal{ //注意嵌套的是结构体指针
          name: "乐乐",
       },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    详细查看:我的笔记链接
    感谢观看

  • 相关阅读:
    SNERT预备队招新CTF体验赛-Misc(SWCTF)
    工业智能网关BL110应用之五十一: 数据上传云金鸽MQTT的配置
    分布式事务解决方案Seata-Golang浅析
    git回滚指定版本相关操作
    利用视觉分析技术提升水面漂浮物、水面垃圾检测效率
    【语音编码】基于matlab ADPCM编解码(Matlab代码实现)
    数仓Hive和分布式计算引擎Spark多整合方式实战和调优方向
    gdb调试时怎样进入C/C++标准库
    缓存行/伪共享问题,验证优化
    《Effective C++》《构造/析构/赋值运算——9、绝不在构造和析构过程中调用virtual函数》
  • 原文地址:https://blog.csdn.net/weixin_54174102/article/details/127971862