V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Flygar
V2EX  ›  Go 编程语言

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

  •  
  •   Flygar · 2018-05-24 23:56:26 +08:00 · 1086 次点击
    这是一个创建于 2135 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    }
    
    Flygar
        1
    Flygar  
    OP
       2018-05-25 00:00:19 +08:00
    爱你们,快帮帮这个失了智的楼主。
    current
        2
    current  
       2018-05-25 00:21:48 +08:00   ❤️ 1
    1. 是的
    2. fmt.Printf("%p", &slice)
    3. 不是
    Flygar
        3
    Flygar  
    OP
       2018-05-25 01:34:55 +08:00
    我勒个擦
    ```go
    fmt.Println(&slice)
    fmt.Printf("%p", &slice)
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5351 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:03 · PVG 17:03 · LAX 02:03 · JFK 05:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.