Go语言用例Go知识库

golang append函数的一个坑

2018-04-22  本文已影响5人  CodingCode

golang append的一个坑

今天又踩到append函数的一个坑了,概况起来,如下

package main

import (
    "fmt"
)

func main() {
    var s = make([]string, 10)
    s = append(s, "aaa")

    fmt.Printf("s[0]=[%s]\n", s[0])
}

运行结果为:

$ go build && ./main
s[0]=[]

What? 难道不应该输出 s[0]=[aaa] 吗?

修改一下代码,把所有元素打出来:

package main

import (
    "fmt"
)

func main() {
    var s = make([]string, 10)
    s = append(s, "aaa")

    fmt.Printf("s[0]=[%s]\n", s[0])

    for i, v := range s {
        fmt.Printf("s[%d]=[%s]\n", i, v)
    }
}

结果是:

$ go build && ./main
s[0]=[]
s[0]=[]
s[1]=[]
s[2]=[]
s[3]=[]
s[4]=[]
s[5]=[]
s[6]=[]
s[7]=[]
s[8]=[]
s[9]=[]
s[10]=[aaa]

"aaa"怎么是第s[10]的元素呢,前面s[0]~s[9]都是空串。

原因append总是在当前slice的最后添加元素,当我们用 var s = make([]string, 10) 初始化s的时候,就已经为s创建了10个元素,每一个元素的值都是空串,调用append函数的时候会发现此时s已经有10个元素了,所有"aaa"会被添加进第11个元素。

上一篇下一篇

猜你喜欢

热点阅读