Golang菜鸟入门:数据类型和表达式

谈到Go的数据类型和表达式时,需要掌握以下这些知识:

  • 基本数据类型:Go中的基本数据类型包括boolstringintint8int16int32int64uintuint8uint16uint32uint64uintptrbyterunefloat32float64。其中byteuint8的别名,runeint32的别名。
  • 下面是关于Go基本数据类型的总结:

    类型名称类型描述大小(字节)默认值范围
    bool布尔类型1falsetrue、false
    byte字节类型100~255
    runeUnicode字符类型40-2147483648~2147483647
    int整数类型平台相关0最大值和最小值取决于平台,通常为-2147483648~2147483647
    int88位整数类型10-128~127
    int1616位整数类型20-32768~32767
    int3232位整数类型40-2147483648~2147483647
    int6464位整数类型80-9223372036854775808~9223372036854775807
    uint无符号整数类型平台相关0最大值取决于平台,通常为0~4294967295
    uint88位无符号整数类型100~255
    uint1616位无符号整数类型200~65535
    uint3232位无符号整数类型400~4294967295
    uint6464位无符号整数类型800~18446744073709551615
    uintptr指针类型平台相关0保存指针地址的整数值

    需要注意的是,Go语言中支持隐式类型转换,但是不同类型之间的转换需要满足特定的规则。另外,Go还提供了一种复合类型complex,用于表示复数。complex由实部和虚部两个float32float64类型组成,可以用于数学运算。

  • 复合数据类型:Go中的复合数据类型包括数组、切片、映射、通道和结构体。
  • 类型名称类型描述大小(字节)初始化方式
    数组(Array)在内存中连续存储多个同类型元素的集合,长度固定不变n * 元素大小var a [n]Ta := [n]T{value1, value2, ..., valuen}a := [...]T{value1, value2, ..., valuen}
    切片(Slice)动态数组,由指向底层数组的指针、长度和容量三部分组成24var s []T = make([]T, len, cap)s := []T{value1, value2, ..., valuen}s := make([]T, length)s := make([]T, length, capacity)
    映射(Map)存储键值对的无序集合,每个键唯一对应一个值平均8字节/条记录var m map[T]U = make(map[T]U)m := map[T]U{key1: value1, key2: value2, ..., keyn: valuen}
    通道(Channel)用于协程间通信的管道,支持发送和接收数据0或者1var ch chan T = make(chan T)ch := make(chan T, buffer)
    结构体 (Struct)自定义类型,它由一系列不同类型的字段组成。结构体中的每个字段都有自己的标识符和类型。N/Atype person struct { name string age int } var p person p = person{name: "Alice", age: 30}

    需要注意的是,Go 语言中除了数组和结构体外,其他数据类型都是引用类型。这意味着切片、映射等类型在传递给函数或赋值给变量时,实际上是传递了一个指向底层数据结构的指针。因此,在操作这些数据类型时需要小心避免出现副作用。

    以下是一些关于Golang复合数据类型数组(Array)的一些例子
  • 字符串数组
  • var names [3]string
    names[0] = "Alice"
    names[1] = "Bob"
    names[2] = "Charlie"
    
  • 布尔数组
  • var flags [4]bool
    flags[0] = true
    flags[1] = false
    flags[2] = false
    flags[3] = true
    
  • 浮点数数组
  • var prices [5]float64
    prices[0] = 1.99
    prices[1] = 2.99
    prices[2] = 3.99
    prices[3] = 4.99
    prices[4] = 5.99
    
  • 结构体数组
  • type Person struct {
        Name string
        Age int
    }
    
    var people [2]Person
    people[0] = Person{"Alice", 30}
    people[1] = Person{"Bob", 25}
    
  • 多维数组
  • var matrix [3][3]int
    matrix[0] = [3]int{1, 2, 3}
    matrix[1] = [3]int{4, 5, 6}
    matrix[2] = [3]int{7, 8, 9}
    
    以下是一些关于Golang复合数据切片(Slice)类型的一些例子
    numbers := []int{1, 2, 3, 4, 5}
    

    以上代码定义了一个名为 numbers 的整数类型切片,其中包含元素 1、2、3、4 和 5。可以通过下标访问切片中的元素。

    还可以使用 make 函数来创建指定长度和容量的切片:

    numbers := make([]int, 5, 10)
    

    该语句创建了一个长度为 5,容量为 10 的整数类型切片。此时所有元素默认初始化为0。

    可以使用 append() 函数将元素添加到切片末尾:

    numbers = append(numbers, 6, 7, 8)
    

    此时 numbers 切片的元素变成了 1、2、3、4、5、6、7 和 8。

    还可以通过切片操作来获取子切片:

    subNumbers := numbers[2:5]
    

    以上代码创建了一个从索引 2 开始,到索引 5 结束(不包括索引 5)的子切片。子切片 subNumbers 包含元素 3、4 和 5。

    以下是一些关于Golang复合数据映射(Map)类型的一些例子
    ages := map[string]int{
        "Alice": 30,
        "Bob":   25,
        "Charlie": 35,
    }
    

    以上代码定义了一个名为 ages 的映射,其中键为字符串类型,值为整数类型。它包含三个条目,分别表示 Alice、Bob 和 Charlie 的年龄。

    可以使用索引操作符 [] 获取映射中的值:

    fmt.Println(ages["Alice"]) // 输出:30
    

    还可以使用 make() 函数创建空映射:

    scores := make(map[string]int)
    

    该语句创建了一个名为 scores 的空映射,键为字符串类型,值为整数类型。

    可以使用 delete() 函数从映射中删除条目:

    delete(ages, "Bob")
    

    此时映射中不再包含键为 Bob 的条目。

    以下是一些关于Golang复合数据通道(Channel)类型的一些例子
    package main

    import "fmt"

    func main() {
    // 创建一个整数类型的通道
    ch := make(chan int)

    // 使用 go 关键字启动一个新的 goroutine
    go func() {
    // 向通道发送值
    ch