slice切片扩容之后,还是指向原来的底层数组吗?

寅恪光潜 寅恪光潜 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

我们看下slice的结构体:

type slice struct {
    array unsafe.Pointer // 指向底层数组
    len int // 长度,必选
    cap int // 容量,可选
}

第一个成员变量指向的是底层数组,还有长度和容量的成员变量,可以扩容。
我们做切片操作,这个在容量范围内都是指向同一个底层数组:

package main

import "fmt"

func main() {
	s1 := []int{1, 2, 3}
	s2 := s1[0:]

	for i, v := range s2 {
		s2[i] = v * 2
	}

	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v", s1, s2)
}
//0xc000012150,0xc000012150[2 4 6],[2 4 6]

内存地址一样,修改s2也修改了s1,然后我们进行扩容操作,看下会不会指向同一底层数组?

package main

import "fmt"

func main() {
	s1 := []int{1, 2, 3}
	s2 := s1[0:]

	for i, v := range s2 {
		s2[i] = v * 2
	}

	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v\n", s1, s2)
	//扩容操作
	s2 = append(s2, 11)
	for i, v := range s2 {
		s2[i] = v * 2
	}
	fmt.Printf("%p,%p", s1, s2)
	fmt.Printf("%v,%v", s1, s2)
}
/*
0xc000012150,0xc000012150[2 4 6],[2 4 6]
0xc000012150,0xc00000e3f0[2 4 6],[4 8 12 22]
*/

我们可以看出在扩容之后,s2的修改,s1没有跟着变化了,说明扩容之后没有指向同一个底层数组而是新开了一个。

...全文

相关推荐

Go语言面试八股文大全

Go语言面试八股文大全

EmoGP

Golang slice切片操作之切片的追加、删除、插入等

主要介绍了Golang slice切片操作之切片的追加、删除、插入等,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38657115

MATLAB "slice"切片功能实现四维显示

利用MATLAB 7.0的"slice"切片功能将三维表示的数据,通过对图形的线型、立面、色彩、渲染、光线、视角等的控制,可形象表现数据四维特性。

yveric

go语言中切片 slice

参考文章: https://studygolang.com/articles/18194?fr=sidebar https://github.com/cch123/golang-notes/blob/master/slice.md https://blog.haohtml.com/archives/18094 slice: 先看一下slcie结构: runtime/slice.go type slice struct { array unsafe.Pointer len int cap int } slice三要素: type、len、cap slice 的底

6???6

浅谈golang slice 切片原理

slice介绍 数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice,slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度,它是可变长的,可以随时往slice里面加数据。 初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数

weixin_38625048
评论 1
收藏 已收藏
分享
返回顶部
寅恪光潜
寅恪光潜 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
Go语言基础与进阶--寅恪光潜 200 成员 136 内容