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

为啥 golang 切片赋值默认是地址呀

  •  
  •   zarte · 2018-08-17 14:41:09 +08:00 · 1932 次点击
    这是一个创建于 2319 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码是这样的 ,要实现建立一个新的二维数组
    变得要多写一行

      var newserverlist  [][]string  
    	for _, addr := range serverlist {  
          tmpaddr=addr 这样 newserverlist 会是一个值一样的数组
    		for i:=0;i<len(filearr);i++{    
              
              
    			//tmpaddr := make([]string,len(addr))  
    			//copy(tmpaddr,addr)  
                  
    			tmpaddr[1] = filearr[i][0]  
    			tmpaddr[3] = filearr[i][1]  
    			newserverlist = append(newserverlist,tmpaddr)  
    			fmt.Println(newserverlist)  
                }  
              }  
    
    1 条回复    2018-08-17 16:22:43 +08:00
    Lpl
        1
    Lpl  
       2018-08-17 16:22:43 +08:00
    slice 里边存了三个值:底层数组指针、长度、容量。
    如果直接:tmpaddr = addr,那么你只是把切片复制了一份,其中:底层数组指针、长度、容量,都没有变化。

    你的目的应该是把 serverList 这个切片复制出来一个新切片,那么这种方式是可行的:
    tmpaddr := make([]string,len(addr))
    copy(tmpaddr,addr)

    例子:
    func main() {
    serverList := [][]string {
    {"a", "b", "c"},
    {"aa", "bb", "cc"},
    }
    fmt.Println(serverList[0]) // => [a b c]
    changeSlice(serverList[0])
    fmt.Println(serverList[0]) // => [changed b c]
    }

    func changeSlice(slice []string) {
    slice[0] = "changed"
    }

    函数 changeSlice 接受了一个 slice 的复制体做实参,此复制体与原 slice 存储了相同的指向原始数组的指针,在函数 changeSlice 中修改 slice 指向数组的值,对于原 slice 也是可见的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:41 · PVG 21:41 · LAX 05:41 · JFK 08:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.