数据类型

#数据类型

一、基本数据类型

Go 语言内置七类基本数据类型

1.布尔类型

 True False //不初始化默认为false

2.整型

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

3.浮点型

float32 
float64   

4.复数

complex64 
complex128  
// real返回复数的实部, image返回复数的虚部

5.字符

rune   //rune是uint类型的别名

6.字符串: string

赋值: a := "hello"

a := "hello world" 
b := []byte(a)
c := []rune(a)
b和c的结果都是:[104 101 108 108 111 44 32 119 111 114 108 100]

7.错误类型: error

8.注意

Go内置两种字符类型: 
    一种是byte的字节类类型(byte是unit的别名), 
    另一种是表示unicode编码的字符rune. rune在go内部是int32类型的别名,占用4个字节.

二、复合数据类型

复合数据类型就是由其他类型组合而成的类型.

1.指针

*pointerType //指针类型使用*后面跟其指向的类型名
*T声明指针  
**T 声明多级指针  
*T 出现在"=" 左边表示指针声明, 右边表示取指针指向的值  
结构体指针访问结构体字段仍然使用"."点操作符,Go语言没有"->"操作符
Go不支持指针的运算  
函数中允许返回局部变量的地址  

2.数组

[n]elementType //数组类型使用[n]后面跟数据元素类型来表示
var arr [2]int
数组初始化:
    a := [3]int{1,2,3}  
    a := [...]int{1,2,3}  
    a := [3]int{1:1, 2:3} // 指定总长度,并通过索引值进行初始化,没有初始化元素时使用类型默认值  
    a := [...]int{1:1, 2:3} //不指定总长度,通过索引值进行初始化,数组长度由最后一个索引值确定,没有指定索引的元素被初始化为类型的零值  

数组的特点:  
    1. 数组创建完长度就固定了,不可以再追加元素  
    2. 数组是值类型的,数组复制或作为函数参数都是值拷贝  

数组相关操作:
1. 数组元素的访问  
    b := a[0]  
    for i, v := range a {
    }  
2. 数据的长度
    len()

3.切片

Go 为切片维护三个元素一一指向底层数组的指针、切片的元素数量和底层数组的容量
[]elementType //切片类型使用[]后面跟切片元素类型来表示

切片的相关操作  
1. 切片的创建
    var array = [...]int{0,1,2,3,4,5,6,7}
    s1 := array[0:4]
    
    a := make([]int, 10)  或  a := make([]int, 10, 15)
2.切片支持的操作
    内置函数len()返回切片长度  
    内置函数cap()返回切片底层数组容量
    内置函数append()对切片追加元素
    内置函数copy()用于复制一个切片
3.字符串和切片的相互转换  
    str := "hello,世界"
    a := []byte(str)  // 将字符串转换为[]byte类型切片
    b := []rune(str)  // 将字符串转换为[]rune类型切片

4.字典

Go语言内置的字典类型叫map.map的类型格式是: map[K]T, 其中K可以是任意可进行比较的类型,T是值类型.
map[keyType]valueType //map类型使用map[键类型]值类型来表示

字典的相关操作  
    1.map的创建
        ma :=map[string]int{"a":1, "b":2}
        make(map[K]T)  或者 make(map[K]T, len)  
    2.map支持的操作  
        map的单个键值访问方式是: mapName[key]  
        可以使用range遍历一个map类型变量,但是不保证每次迭代元素的顺序 
            for k, v := range mp {
                fmt.Println("key=", k, "value=", v)
            } 
        删除map中的某个键值,使用如下语法:delete(mapName, key)  
        可以使用内置的len()函数返回map中的键值对数量

    注意:
        Go内置的map不是并发安全的,并发安全的map可以使用标准包sync中的map。 
        不要直接修改map value内某个元素的值, 如果想修改map的某个键值,则必须整体复制。
        type User struct {
               name string
               age int
        }
    ma := make(map[int]User)
    andes := User{
        name: "andes",
        age: 18,
    }
    ma[1] = andes
    ma[1].age = 19 //Error 不能通过map引用直接修改andes.age=19
    andes.age = 19
    ma[1] = andes //必须整体替换value

5.通道

chan valueType  //通道使用chan后面跟通道元素类型来表示

6.结构和接口

  struct {  
       feildType feildType  
       feildType feildType  
       ...  
  }  // 结构类型使用struct{} 将各个结构字段扩起来表示
  struct类型字面量
  struct {
        FeildName FeildType
        FeildName FeildType
        FeildName FeildType
  }
  自定义struct类型
  type TypeName struct {
        FeildName FeildType
        FeildName FeildType
        FeildName FeildType
  }
  struct类型变量的初始化
  type Persion struct {
    Name string
    Age int
  }
  type Student struct {
    *Persion
    Number int
  }
  // 按照类型声明顺序,逐个赋值
  a := Persion{"Tom", 21}  //不推荐这种初始化方式
  // 推荐下面这种赋值方式
  p := &Persion {
    Name: "tata",
    Age: 12
  }
  s := Strudent {
    Persion: p,
    Number: 110,
  }