1. 切片:切片是数组的一个引用,因此切片是引用类型
func main() {
var arr = [6]int{1, 2, 3, 4, 5}
var slice = arr[1:]
fmt.Println(arr)
fmt.Println(slice)
fmt.Printf("%p\n", &arr[1])
fmt.Printf("%p\n", slice)
}
package main
import (
"fmt"
)
type test struct { //自定义类型
ptr *[100]int
len int
cap int
}
func maketest(slice test, cap int) test { //make 切片
slice.ptr = new([100]int)
slice.cap = cap
slice.len = 0
return slice
}
func modify(slice test) { //设置切片值
slice.ptr[1] = 10000
}
func sliceTest() {
var test1 test // 定义切片,类型为自定义的test
test1 = maketest(test1, 10) 初始化切片
test1.ptr[1] = 100 // 将切片的prt[1]设置为 100
modify(test1) //改变切片值,
fmt.Println(test1.ptr) 打印test1
}
func main() {
sliceTest()
}
由于自定义 test1 的ptr改变的是地址,所以打印是改变了切片的值
slice map channel都是引用类型,所以改变是改变的变量的地址。
func modify(slice test) {
slice.ptr[1] = 10000
fmt.Printf("%p\n", slice.ptr)
}
func sliceTest() {
var test1 test
test1 = maketest(test1, 10)
test1.ptr[1] = 100
modify(test1)
fmt.Println(test1.ptr)
fmt.Printf("%p", test1.ptr)