Golang(二)基本概念

2022-11-23 19:26:30 浏览数 (1)

类型

  • 18个基本类型:bool、string、rune、byte、int、uint、int8、uint、int8、int16、uint16、int32、uint32、int64、uint64、float64、complex64、complex128
  • 7个复合类型:array、struct、function、interface、slice、map、channel
  • 其中,slice、map 和 channel 都是引用类型
  • 最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程是才需要,特别是 Go 语言和 C 语言函数库或操作系统接口相交互的地方 

值传递和引用传递

  • 在golang中函数的参数默认为按值传递,即在函数内部修改传入参数的值是函数外部传入值的深拷贝
  • 如果想要使用引用传递,需要将传入的参数设置为指针类型。如果传入的参数数据很大,建议使用指针类型,减少内存因拷贝参数而占用
  • 本质上指针作为入参也是值传递,go里面其实都是值传递,只是指针一般比原始参数小很多,拷贝代价更低,也方便在不同函数间修改同一个变量

枚举

  • 在go语言中,没有直接支持枚举的关键字,也就造成go没有直接枚举的功能。但是go提供另一种方法来实现枚举,那就是 const+iota
代码语言:javascript复制
// 实现枚举例子

type State int

// iota 初始化后会自动递增
const (
    Running State = iota // value --> 0
    Stopped              // value --> 1
    Rebooting            // value --> 2
    Terminated           // value --> 3
)

func (this State) String() string {
    switch this {
    case Running:
        return "Running"
    case Stopped:
        return "Stopped"
    default:
        return "Unknow"
    }
}

func main() {
    state := Stopped
    fmt.Println("state", state)
}
// 输出 state Running
// 没有重载String函数的情况下则输出 state 0

切片与函数参数

  • 上述已经提过,slice 本身为引用类型,作为参数会将指针的值作为参数以值传递方式传递进函数内部
  • 此时函数内部会产生另一个底层数组相同的切片。修改相应位置的值,函数外的切片对应的值也会随之改变。但是执行 append 操作时因为是两个切片,函数外的 len 值不会改变
  • 不断 append,直到超过 cap 时,底层数组会改变(尺寸变大一倍)。此时修改某一位置的值,函数外的切片不会体现
  • 示例代码如下:
代码语言:javascript复制
package main

import "fmt"

func testSliceParams(strs []string, msg string) {
    fmt.Printf("WangAo test: strs----2: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    tmp := strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs----3: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----4: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs[0] = tmp
    fmt.Printf("WangAo test: strs----5: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----6: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----7: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----8: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    strs = append(strs, msg)
    fmt.Printf("WangAo test: strs----9: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    tmp = strs[0]
    strs[0] = msg
    fmt.Printf("WangAo test: strs---10: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
}

func main()  {
    strs := make([]string, 0, 3)
    strs = append(strs, "test1")
    fmt.Printf("WangAo test: strs----1: %d %d %p %vn", len(strs), cap(strs), &strs, strs)
    testSliceParams(strs, "test2")
    fmt.Printf("WangAo test: strs---11: %d %d %p %vn", len(strs), cap(strs), &strs, strs)

}

0 人点赞