golang切片数据结构解释

2018-10-17 来源:  发布在  https://www.cnblogs.com/LC161616/p/9806440.html

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)

相关文章