Как добавить int к слайсу - PullRequest
       47

Как добавить int к слайсу

0 голосов
/ 12 декабря 2018

Я довольно новичок в Go, и поэтому мой вопрос может показаться немного наивным.

У меня есть фрагмент, который я создал с помощью

var x []int;
for i := 2; i < 10; i += 2 {
    x = append(x, i);
}

Я хочу добавить к этому целое числоslice, что-то вроде

x = append(2, x)

, но очевидно, что он не будет работать, так как append нуждается в срезе в качестве первого аргумента.

Я пробовал this , но он работает толькодля строк, и это не работает в моем случае.

1 Ответ

0 голосов
/ 12 декабря 2018

Использовать фрагмент составной литерал : []int{1}, например,

package main

import (
    "fmt"
)

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(x)

    x = append([]int{1}, x...)

    fmt.Println(x)
}

Детская площадка: https://play.golang.org/p/Yc87gO7gJlD

Выход:

[2 4 6 8]
[1 2 4 6 8]

Однако эта более эффективная версия может выделять меньше ресурсов. Распределение необходимо только в том случае, если нет свободных резервных срезов.

package main

import (
    "fmt"
)

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(x)

    x = append(x, 0)
    copy(x[1:], x)
    x[0] = 1

    fmt.Println(x)
}

Детская площадка: https://play.golang.org/p/fswXul_YfvD

Вывод:

[2 4 6 8]
[1 2 4 6 8]

Хороший код должен быть читаемым.В Go мы часто скрываем детали реализации внутри функции.Компиляторы Go оптимизируют компиляторы, небольшие простые функции (например, prependInt) встроены.

package main

import (
    "fmt"
)

func prependInt(x []int, y int) []int {
    x = append(x, 0)
    copy(x[1:], x)
    x[0] = y
    return x
}

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(len(x), cap(x), x)

    x = prependInt(x, 1)

    fmt.Println(len(x), cap(x), x)
}

Детская площадка: https://play.golang.org/p/wl6gvoXraKH

Вывод:

4 4 [2 4 6 8]
5 8 [1 2 4 6 8]

См. Go SliceTricks .

...