Go 笔记之数据类型

go 笔记系列,旨在简明扼要地概述学习的关键点,以便他日查证拾遗

  • 工作区结构

    • src pkg bin
    • main.main() 函数(这个函数位于主包)是每一个独立的可运行程序的入口点。
    • 除了 main 包之外,其它的包最后都会生成 *.a 文件(也就是包文件)并放置在 GOPATH/pkg/GOPATH/pkg/GOOS_$GOARCH 中
    • 用 var 方式来定义全局变量,:= 进行在函数内的简短声明,_ 特殊的变量名,任何赋予它的值都会被丢弃。
    • 字符串使用""或``,其不可变,但可以进行切片操作;内置error错误类型;
    • iota 枚举
  • 声明

    import(
        "fmt"
        "os"
    )
    
    const(
        i = 100
        pi = 3.1415
        prefix = "Go_"
    )
    
    var(
        i int
        pi float32
        prefix string
    )
  • iota枚举关键字与常量

    • 默认开始值是 0,const 中每增加一行加 1
    • 每遇到一个 const 关键字,iota 就会重置
    • 常量声明省略值时,默认和之前一个值的字面相同
    • 在同一行值相同
  • golang变量可见性规则

    • 大写字母开头的变量,公有变量,可导出。小写则是私有变量。
  • array, slice, map

    • 声明 slice 时,方括号内没有任何字符。slice 的 index 只能是 int 类型
    • 数组之间的赋值是值的赋值,传入的其实是该数组的副本,而不是它的指针

          //array
          var arr [10]int     // 声明了一个int类型的数组
          b := [10]int{1, 2, 3} // 声明了一个长度为 10 的 int 数组,其中前三个元素初始化为 1、2、3,其它默认为 0
          c := [...]int{4, 5, 6} // 可以省略长度而采用 `...` 的方式,Go 会自动根据元素个数来计算长度
      
          //slice, 和声明 array 一样,只是少了长度
          var fslice []int
          // 声明并初始化
          slice := []byte {'a', 'b', 'c', 'd'}
          //  a 指向数组的第 3 个元素开始,并到第五个元素结束,左开右闭
          a = ar[2:5]
          // 第三个参数指定切片容量
          slice = array[2:4:7]
      
  • slice 引用类型 常用简便操作

    • slice 的默认开始位置是 0,ar[:n] 等价于 ar[0:n]
    • slice 的第二个序列默认是数组的长度,ar[n:] 等价于 ar[n:len(ar)]
    • 如果从一个数组里面直接获取 slice,可以这样 ar[:],即等价于 ar[0:len(ar)],包含了全部的元素
  • slice 常用内置函数

    • len 获取 slice 的长度
    • cap 获取 slice 的最大容量
    • append 向 slice 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice
    • copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst,并且返回复制的元素的个数
  • map

        var numbers map[string]int
    
        numbers = make(map[string]int)
        numbers["one"] = 1  // 赋值
    
        rating := map[string]float32{"C":5, "Go":4.5, "Python":4.5, "C++":2 }
        // map 有两个返回值,第二个返回值,如果不存在 key,那么 ok 为 false,如果存在 ok 为 true
        csharpRating, ok := rating["C#"]
    
    • 通过delete删除map的元素
    • map 也是一种引用类型,如果两个 map 同时指向一个底层,那么一个改变,另一个也相应的改变
    • map 和其他基本型别不同,它不是 thread-safe,在多个 go-routine 存取时,必须使用 mutex lock 机制
  • make vs new

    • new 用于各种类型的内存分配。new 返回指针,即*T类型的值
    • make 用于内建类型(map、slice 和 channel)的内存分配。make 返回一个有初始值(非零)的T类型,而不是 *T
    • 零值并非是指空值,而是一种变量未填充前的默认值,通常为0

          // 常用零值列表
          int     0
          int8    0
          int32   0
          int64   0
          uint    0x0
          rune    0 // rune 的实际类型是 int32
          byte    0x0 // byte 的实际类型是 uint8
          float32 0 // 长度为 4 byte
          float64 0 // 长度为 8 byte
          bool    false
          string  "
本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商