The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zarte

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

  •  
  •   zarte · Aug 17, 2018 · 2290 views
    This topic created in 2847 days ago, the information mentioned may be changed or developed.

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

      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 replies    2018-08-17 16:22:43 +08:00
    Lpl
        1
    Lpl  
       Aug 17, 2018
    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 也是可见的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1197 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:29 · PVG 07:29 · LAX 16:29 · JFK 19:29
    ♥ Do have faith in what you're doing.