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

2023年 7月 11日 30.2k 0

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

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

    类型名称 类型描述 大小(字节) 默认值 范围
    bool 布尔类型 1 false true、false
    byte 字节类型 1 0 0~255
    rune Unicode字符类型 4 0 -2147483648~2147483647
    int 整数类型 平台相关 0 最大值和最小值取决于平台,通常为-2147483648~2147483647
    int8 8位整数类型 1 0 -128~127
    int16 16位整数类型 2 0 -32768~32767
    int32 32位整数类型 4 0 -2147483648~2147483647
    int64 64位整数类型 8 0 -9223372036854775808~9223372036854775807
    uint 无符号整数类型 平台相关 0 最大值取决于平台,通常为0~4294967295
    uint8 8位无符号整数类型 1 0 0~255
    uint16 16位无符号整数类型 2 0 0~65535
    uint32 32位无符号整数类型 4 0 0~4294967295
    uint64 64位无符号整数类型 8 0 0~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) 动态数组,由指向底层数组的指针、长度和容量三部分组成 24 var 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或者1 var ch chan T = make(chan T)ch := make(chan T, buffer)
    结构体 (Struct) 自定义类型,它由一系列不同类型的字段组成。结构体中的每个字段都有自己的标识符和类型。 N/A type 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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论