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

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

  •  
  •   zarte · 89 天前 · 692 次点击
    这是一个创建于 89 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

      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
        1
    Lpl   89 天前
    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 也是可见的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   712 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 20:21 · PVG 04:21 · LAX 12:21 · JFK 15:21
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1