go语言数组,切片,map的本质

即使切片的容量为100,但长度为5,仍不能访问第5个之后的元素(下标越界),如下图会报故,只能用append追加。

如果一个切片追加另外一个切片 需要使用 … 不定参格式

切片名传递时并不是真正的指针传递!
切片名包含三个信息:1.切片首个数据的地址,2.切片长度len,3.切片容量cap。
切片在作函数参数传递或做浅拷贝(slice2 := slice1)时,之所以修改一个切片会影响另一个切片的值,是因为他们的切片名中包含的“切片首个数据的地址”相同,可以理解为指向同一片内存,修改一个切片的数据会影响另一个切片中的数据。但是当一个切片的长度和容量改变时,另一个切片名中包含的信息并不会改变!所以切片名传递时并不是真正的指针传递,要解决这个问题就要把切片名当成普通变量用指针传递切片名自身的地址(而不是切片名三个信息中的那个数据首地址)。见指针中的切片指针章节。

在GO语言中,数组作为参数进行传递是值传递,而切片作为参数进行传递是引用传递
(实参与形参切片名中包含的地址信息,并不是真正的切片的地址传递)

func BubbleSort111(slice []int){
	fmt.Printf("%p\n",slice)
	for i:=0; i<len(slice) -1; i++{
		for j:=0;j<len(slice) -1-i;j++{
			if slice[j] < slice[j+1]{
				slice[j],slice[j+1] = slice[j+1],slice[j]
			}
		}
	}
}
func main() {
	//var slice []int //空切片
	//var slice []int = []int{1, 2, 3, 4, 5}
	slice := make([]int, 10, 10)
	//unsafe.Sizeof打印数据类型所占空间,切片名本身是个地址,
	// 包括指针、长度、容量,所以64位系统中占3*8个字节
	fmt.Println(unsafe.Sizeof(slice))
	//不能用cap,要用len
	//for i := 0; i < cap(slice); i++ {
	//	fmt.Print(slice[i]," ")
	//}
	slice[9] = 1
	for i := 0; i < len(slice); i++ {
		fmt.Print(slice[i]," ")
	}
	fmt.Println()
	fmt.Println(len(slice), cap(slice))

	//当超出一次性追加内容超过原始容量的两倍则按偶数增加,而不是一次次翻倍
	slice = append(slice, 1,2,3,4,5,6,7,8,9,10,11)
	fmt.Println(slice)
	fmt.Println(len(slice))
	fmt.Println(cap(slice))

	//切片截取
	s := slice[1:5:7]
	fmt.Println(s, len(s), cap(s))

	//切片作为函数参数
	fmt.Println(slice)
	fmt.Printf("%p\n",slice)
	BubbleSort111(slice)
	fmt.Println(slice)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值