新的一天,新的烦恼。golang 内存空间的开辟问题。

2018-05-24 23:56:26 +08:00
 Flygar
package main

import "fmt"

func main() {
	s1 := []byte{1, 2, 3}
	s2 := []byte{4, 5}

	fmt.Println(AppendByte(s1, s2...))
	fmt.Println(s1)
}

func AppendByte(slice []byte, data ...byte) []byte {
	//slice[0]=111 // 引用传递,会修改原 slice
	m := len(slice)
	n := m + len(data)
	if n > cap(slice) {
		newSlice := make([]byte, (n+1)*2)
		copy(newSlice, slice)
		slice = newSlice
		//问题:上面这个 slice 是新开辟的内存空间?已经原始原来的那个 slice 的内存空间了,是吧~?
		fmt.Println(&slice)
		//我想比较 slice 的地址,可是输出的是&[1 2 3 0 0 0 0 0 0 0 0 0],怎么输出 0xc42000e1d0 这种类型的?
	}
	slice = slice[0:n] //最左边的这个 slice 的内存空间是不是也新开辟的
	fmt.Println("slice:", slice)
	copy(slice[m:n], data)
	fmt.Println("slice2", slice)
	return slice
}
1266 次点击
所在节点    Go 编程语言
3 条回复
Flygar
2018-05-25 00:00:19 +08:00
爱你们,快帮帮这个失了智的楼主。
current
2018-05-25 00:21:48 +08:00
1. 是的
2. fmt.Printf("%p", &slice)
3. 不是
Flygar
2018-05-25 01:34:55 +08:00
我勒个擦
```go
fmt.Println(&slice)
fmt.Printf("%p", &slice)
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/457592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX