在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  GO  網(wǎng)絡(luò)安全/ golang string slice作為函數(shù)參數(shù)傳遞的問題

golang string slice作為函數(shù)參數(shù)傳遞的問題

package main

func Sample(args []string) {
    args = append(args, "D", "E")
}

func main() {
    args := []string{}
    args = append(args, "A","B","C")
        Sample(args)
    for _, arg := range args {    
        println(arg)
    }
}

比如在上面這個(gè)程序(https://play.golang.org/p/0Ch...)里,我希望Sample函數(shù)執(zhí)行完成之后,args里面的結(jié)果是ABCDE,但是真實(shí)的結(jié)果是ABC。

這跟我對(duì)slice的理解不一樣啊。

我試了一下,在Sample函數(shù)里是可以對(duì)里面的string做修改的,

package main

func Sample(args []string) {
    args[2] = "F"
}

func main() {
    args := []string{}
    args = append(args, "A","B","C")
    Sample(args)
    for _, arg := range args {    
        println(arg)
    }
}

上面這個(gè)程序(https://play.golang.org/p/Y81...)就把a(bǔ)rgs的最后一個(gè)元素改成F了。

還是說因?yàn)閟tring也是變長的結(jié)構(gòu),所以函數(shù)在傳參的時(shí)候就把a(bǔ)rgs的長度固定住了。這是什么原理啊。

回答
編輯回答
選擇

首先golang只有值傳遞, slice傳遞的是reflect.SliceHeader的copy, 其中的Data字段指向底層數(shù)組, append擴(kuò)容導(dǎo)致底層數(shù)組重新分配,即Data的指向發(fā)生了變化.args[2] = "F"僅修改了底層數(shù)組的值,Data的指向不變.

你可看看golang官方的slice介紹Go Slices: usage and internals.

2017年9月10日 18:12
編輯回答
喵小咪
func Sample(args []string) {
    println(len(args))
    println(cap(args))
    println(args)
    args = append(args, "D", "E")
    println(len(args))
    println(cap(args))
    println(args)
}

會(huì)發(fā)生擴(kuò)容,args的地址已經(jīng)改了,內(nèi)部的數(shù)組也已經(jīng)變了。
但是go中只有值傳遞,所以外面的args還是引用前面的數(shù)組。
可以將args返回解決。

2018年5月9日 18:55
編輯回答
心沉
package main

func Sample(args *[]string) {
    *args = append(*args, "D", "E")
}

func main() {
    args := []string{}
    args = append(args, "A", "B", "C")
    Sample(&args)
    for _, arg := range args {
        println(arg)
    }
}

最簡單的辦法就是這樣了
另一種方式,就是在Sample方法中,返回?cái)?shù)組
其實(shí)就是值傳遞和指針傳遞的問題,你可以去搜一些相關(guān)資料,看一下就明白了

2018年2月24日 03:27