Подтвердить что ты не робот

В чем разница между [] string и... string в golang?

На языке Go,

[]string представляет собой строковый массив

и мы также используем ...string в качестве параметра.

В чем разница?

Определение функции:

func f(args ...string) {}

Могу ли я вызвать эту функцию, как показано ниже?

args := []string{"a", "b"}

f(args)
4b9b3361

Ответ 1

[]string представляет собой строковый массив

Технически это фрагмент, который ссылается на базовый массив

и мы также используем ...string в качестве параметра.

В чем разница?

Что касается структуры, ничего особенного. Тип данных, полученный в обоих синтаксисах, одинаков.

Синтаксис параметра ... создает переменный параметр. Он будет принимать ноль или более string аргументов и ссылаться на них как на фрагмент.

Что касается вызова f, вы можете передать фрагмент строки в параметр переменной со следующим синтаксисом:

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

Этот синтаксис доступен либо для среза, построенного с использованием литерального синтаксиса, либо для среза, представляющего параметр с переменными параметрами (поскольку между ними действительно нет различий).

http://play.golang.org/p/QWmzgIWpF8

Ответ 2

Оба создают массив строк, но разница в том, как он называется.

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

Это позволяет принимать переменное количество аргументов (все одинакового типа)

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

Ответ 3

Вот что вы хотите:

var args []string = []string{"A", "B", "C"}

func Sample(args ...string) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}

func main() {
    Sample(args...)
}

Играть: http://play.golang.org/p/N1ciDUKfG1

Ответ 4

Он упрощает ваши параметры функции. Вот пример (https://play.golang.org/p/euMuy6IvaM): Метод SampleEllipsis принимает от нуля ко многим параметрам одного и того же типа, но в методе SampleArray обязательно объявляется args.

package main

import "fmt"

func SampleEllipsis(args ...string) {
    fmt.Printf("Sample ellipsis : %+v\n",args)
}


func SampleArray(args []string) {
    fmt.Println("Sample array ")
    SampleEllipsis(args...)
}

func main() {
    // Method one
    SampleEllipsis([]string{"A", "B", "C"}...)
    // Method two
    SampleEllipsis("A", "B", "C")
    // Method three
    SampleEllipsis()

    // Simple array
    SampleArray([]string{"A", "B", "C"})

    // Simple array
    SampleArray([]string{})

}

Возвращает:

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []