类型
- 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
// 实现枚举例子 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 时,底层数组会改变(尺寸变大一倍)。此时修改某一位置的值,函数外的切片不会体现
- 示例代码如下:
package main import "fmt" func testSliceParams(strs []string, msg string) { fmt.Printf("WangAo test: strs----2: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) tmp := strs[0] strs[0] = msg fmt.Printf("WangAo test: strs----3: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs = append(strs, msg) fmt.Printf("WangAo test: strs----4: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs[0] = tmp fmt.Printf("WangAo test: strs----5: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs = append(strs, msg) fmt.Printf("WangAo test: strs----6: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs = append(strs, msg) fmt.Printf("WangAo test: strs----7: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs = append(strs, msg) fmt.Printf("WangAo test: strs----8: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) strs = append(strs, msg) fmt.Printf("WangAo test: strs----9: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) tmp = strs[0] strs[0] = msg fmt.Printf("WangAo test: strs---10: %d %d %p %v\n", 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 %v\n", len(strs), cap(strs), &strs, strs) testSliceParams(strs, "test2") fmt.Printf("WangAo test: strs---11: %d %d %p %v\n", len(strs), cap(strs), &strs, strs) }
原文地址:https://www.cnblogs.com/wangao1236/p/10898950.html
时间: 2024-11-02 13:15:10