文章目录
定义
-
值类型
变量直接储存值
值存在栈区中(栈中存放的是生命周期短的变量, 比如局部变量) -
引用类型
变量储存地址, 地址储存最终的值
存放在堆区(栈中存放的是生命周期长的变量, 比如全局变量)
数据类型
值类型 | 引用类型 |
---|---|
int | slice |
float | map |
bool | channel |
string | interface |
array | |
struct |
修改
- 值类型赋值
package main import "fmt" func main() { // 值类型 a := [3]int{1, 2, 3} // 直接赋值 b := a b[0] = 100 fmt.Println(a, b) // [1 2 3] [100 2 3] }
- 引用类型 - 深拷贝
package main import "fmt" func main() { // 引用类型 c := []int{1, 2, 3} // 构造一个长度容量和 c 相同的切片 d := make([]int, len(c), cap(c)) // 深拷贝赋值 copy(d, c) d[0] = 100 fmt.Println(c, d) }
- 在函数中修改元素时
package main // 函数传参使用, 实际上是将参数复制一份, 在函数内部修改 import "fmt" // 示例, 直接传值修改不生效 func a(a [2]int) { a[0] = 10 } // 值类型,若需要修改,传进来的必须是指针 func b(a *[2]int) { a[0] = 10 } // 引用类型直接传即可 func c(a []int) { a[0] = 10 } func main() { x := [2]int{1, 2} a(x) y := [2]int{1, 2} b(&y) z := []int{1, 2} c(z) fmt.Println(x, y, z) // [1 2] [10 2] [10 2] }
声明, 初始化和赋值
- 值类型
package main import "fmt" // 需要声明 --> 赋值 func main() { // 声明 var a [3]int // 此时的值为 [0 0 0] // 赋值 a = [3]int{1, 2, 3} // 声明+赋值可简写为 aa := [3]int{1,2,3} // 结果为[1 2 3] }
- 引用类型
package main import "fmt" // 需要声明 --> 初始化 --> 赋值 func main() { // 声明 var b []int // 此时的值为nil // 初始化 b = make([]int, 0, 10) // 此时的值为[], 因为长度为0 // 赋值 b = []int{1, 2, 3} // 声明+初始化可简写为 bb := make([]int, 0, 10) // 此时的值为[], 因为长度为0 // 声明+初始化+赋值可简写为 bbb := []int{1, 2, 3} }