Не может использовать руну типа [] как руну типа в приложении

package main

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

func main() {
    x := append(lettersLower, lettersUpper)
}

Почему это не работает? Как я могу добавить lettersLower а также lettersUpper?

prog.go:7: cannot use lettersUpper (type []rune) as type rune in append

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

1 ответ

Решение

Это потому что append не принимает список для добавления, а один или несколько элементов для добавления. Вы можете приспособиться к этому с ... по второму аргументу append:

package main

import "fmt"

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

func main() {
    x := append(lettersLower, lettersUpper...)
    fmt.Println(len(x))
}

Попробуйте это на детской площадке.

Обратите внимание, что 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)
}

Когда вы пытаетесь распечатать foo добавив его в сублицензию, вы получите странное сочетание старого и нового контента.

Там, где общий базовый массив является проблемой, вы можете либо использовать строки (строковые байты являются неизменяемыми, довольно эффективную защиту от случайных перезаписей), либо сделать копию, как я сделал с append([]byte(nil), foo[:10]...) выше.

Другие вопросы по тегам