文章目录
- 定义
- 数据类型
- 修改
- 声明, 初始化和赋值
定义
- 值类型
变量直接储存值
值存在栈区中(栈中存放的是生命周期短的变量, 比如局部变量) - 引用类型
变量储存地址, 地址储存最终的值
存放在堆区(栈中存放的是生命周期长的变量, 比如全局变量)
数据类型
值类型 | 引用类型 |
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}
}