不能使用类型[]符文作为附加类型符文

fnk*_*nkr 2 append go rune

package main

var lettersLower = []rune("abcdefghijklmnopqrstuvwxyz")
var lettersUpper = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

func main() {
    x := append(lettersLower, lettersUpper)
}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?我怎么能追加lettersLowerlettersUpper

prog.go:7: cannot use lettersUpper (type []rune) as type rune in append
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/ovx_o2rKPC

two*_*two 11

这是因为append并不需要一个列表追加,而是一个或多个项目追加.你可以...通过第二个参数来适应这个append:

package main

import "fmt"

var lettersLower = []rune("abcdefghijklmnopqrstuvwxyz")
var lettersUpper = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

func main() {
    x := append(lettersLower, lettersUpper...)
    fmt.Println(len(x))
}
Run Code Online (Sandbox Code Playgroud)

在游乐场试试吧.

请注意,append并不总是重新分配底层数组(这会导致性能和内存使用方面的问题).就这个样本而言你很好,但是如果你试图将相同的内存用于多种目的,它可能会咬你.一个(人为的,也许不清楚)的例子:

package main

import (
    "fmt"
    "os"
)

func main() {
    foo := []byte("this is a BIG OLD TEST!!\n")
    tst := []byte("little test")
    bar := append(foo[:10], tst...)

    // now bar is right, but foo is a mix of old and new text!
    fmt.Print("without copy, foo after:  ")
    os.Stdout.Write(foo)

    // ok, now the same exercise but with an explicit copy of foo
    foo = []byte("this is a BIG OLD TEST!!\n")
    bar = append([]byte(nil), foo[:10]...) // copies foo[:10]
    bar = append(bar, tst...)

    // this time we modified a copy, and foo is its original self
    fmt.Print("with a copy, foo after:   ")
    os.Stdout.Write(foo)
}
Run Code Online (Sandbox Code Playgroud)

当你尝试foo在附加到它的子拼图后进行打印时,你会得到新旧内容的奇怪组合.

在共享底层数组存在问题的情况下,您可以使用字符串(字符串字节是不可变的,非常有效的防止意外覆盖)或者像我append([]byte(nil), foo[:10]...)上面那样制作副本.

  • 如果它们是常量,如`const`,它们只能是字符串,而不是`[] rune`s,所以你必须在运行时转换(或者只是不要让它们成为`const`,就像你做的那样) .但关于切片可能共享内存的一点并不意味着吓跑你 - 你的`append`看起来很好 - 只是关于切片不完全像字符串的一般警告. (2认同)