Go语法基础 - 数据类型 | 青训营

83 阅读2分钟

基本数据类型

布尔

声明时若不指定,默认false

整型

byte, int, int8, int16, int32, int64, uint, uint16, uint32, uint64, uintptr

byte = uint8 占8位

浮点

float64, complex128

复数 complex128 由两个float64组成,实部和虚部 方法

 var v = complex(2.1,2)
 a := real(v)
 b := image(v)

字符:rune

实际上是int32 默认编码是utf-8 所以需要4个字节

字符串:string

  1. 常量 只读,不能通过索引修改值
  2. 可以转化为[]byte 但是慎用,会复制内容,开销大(也可以转为[]rune)
 a := "a string"
 b := []byte(a)
 c := []rune(a)
  1. 底层实现,类似stl-string,尾部没有空字符,存储形式是字符数组起始地址(指针)+长度
 type stringStruct struct{
     str unsafe.Pointer
     len int
 }
  1. 对字符串切片返回的还是string,不是切片,与底层实现有关
 b := a[0:4]
 // 可以省略一边 
 b := a[:4]
  1. 运算
 a := "hello "
 b := "world"
 // 拼接
 ​
 c := a + b
 d := len(c)
 ​
 // 按字节遍历数组
 for i := 0; i < len(c); i++ {
     fmt.PrintIn(d[i])    
 }
 ​
 // 按字遍历数组 
 for i, v := range c {
     fmt.PrintIn(i,v)
 }

错误:error

复合数据类型

 * pointType
 [n] elementType
 [] elementType
 map [keyType]valueType
 chan valueType
 struct {
     feildName feildType
     feildName feildType
     ...
 }
 interface {
     method1(inputParams)(returnParams)
     method2(inputParams)(returnParams)
     ...
 }

指针

  1. *&的使用同C
  2. 没有 ->,结构体指针访问结构体成员也用.
  3. 不支持指针运算
  4. 允许返回局部变量的地址(比如函数内部变量)in heap

数组

长度在初始化时就固定了,并且相同元素类型长度不同的数组是不同类型的

操作

 a := [3]int{1,2,3}
 a := [...]int{1,2,3}
 // 指定索引,没有的设为类型默认值
 a := [3]int{1:1,2:2}
 //  a = [1,2,0]
 a := [...]{1:1,2:2:2}
 //  a = [1,2] 长度推断为出现的最大索引值

访问:

  1. 索引
  2. len方法
  3. 两种for循环

切片

变长数组,像vector

底层实现

 type slicew struct {
     array unsafe.Pointer
     len int
     cap int // 容量
 } 

初始化

 s := array[start:end]
 // 0-len 可省略 左闭右开 
 s := make([]int, 10)
 //  类型 容量
 s := make([]int, 10, 15)
 //  类型,长度,容量

不赋值的话,array指针值为nil

操作

  • len(s)
  • cap(s)
  • append(s,newElement)
  • copy(des, src)

copy部分的长度是 两者最短长

字典

初始化

 m := map[string]int{"a":1,"b":2}
 fmt.PrintIn(m["a"])
 // 用make
 // 默认容量
 m1 := make(map[int]string)
 // 指定容量
 m2 := make(map[int]string, 10)

操作

  1. 访问和修改 直接用[key]
  2. 可以用range遍历,但是是乱序,每次不一定一样
 for k,v := range mp {
     fmt.PrintIn("key=", k, "value=", v)
 }
  1. 删除键
 // delete(mapName,key)
 delete(m,1)
  1. 键值对数量 len(m)
  1. 不是并发安全的,并发安全的可以用包sync中的map
  2. 不能通过map[key].key修改value结构体内部的值,整体替换value

结构

 type TypeName struct {
     FieldName FieldType
     FieldName FieldType
     FieldName FieldType
     ...
 }
 ​
 type Person struct {
     Name    string
     Age     int
 }
 // 初始化方法
 a := Person{"Jerry", 21}
 // 不好,如果struct新增字段,会报错,最好指定name
 a := Person{
     Name:   "Jerry",
     Age:    12,
 }