Golang, что делает следующее [] - PullRequest
0 голосов
/ 20 марта 2020

Я новичок в golang и у меня есть базовый c вопрос. У меня есть следующий код, взятый из примера из Интернета

func (d Direction) String() string {
    return [...]string{"North", "East", "South", "West"}[d]
}

Я запутался, что делает [d] в теле метода?

Ответы [ 3 ]

5 голосов
/ 20 марта 2020

[d] - это просто индексное выражение , оно индексирует массив , созданный с составным литералом перед ним.

Это:

[...]string{"North", "East", "South", "West"}

Является составным литералом массива, он создает массив типа элемента string с перечисленными элементами, а последующий [d] индексирует этот массив. Метод возвращает элемент d th этого массива 4-х размеров.

Обратите внимание, что ... означает, что мы хотим, чтобы компилятор автоматически определил размер массива:

Обозначение ... указывает длину массива, равную максимальному индексу элемента плюс один.

Массивы в Go не следует путать с слайсами, Для хорошего ознакомления с массивами и слайсами прочитайте официальные сообщения блога:

Блог Go: Go Ломтики: использование и внутренние компоненты

Go Блог: массивы, срезы (и строки): механика 'append'

3 голосов
/ 20 марта 2020

Эта часть объявляет литерал массива с четырьмя строками:

[...]string{"North", "East", "South", "West"}

Затем эта часть получает элемент d из массива:

[...]string{"North", "East", "South", "West"}[d]

Direction должен быть int, чтобы это сработало.

1 голос
/ 20 марта 2020

@ icza и @Burak Serdar отметили, что [d] является индексным выражением.

Ниже приведен только рабочий пример, чтобы увидеть вывод

package main

import "fmt"

type Direction int

func (d Direction) String() string {
    return [...]string{"North", "East", "South", "West"}[d]
}

func main() {
    n:=Direction(0)  // d=0
    fmt.Println(n)
    w:=Direction(3)  // d=3
    fmt.Println(w)
}

Вывод:

North
West

Чтобы быть более понятным,

return [...]string{"North", "East", "South", "West"}[d]

можно расширить как

func (d Direction) String() string {
    var directions = [...]string{"North", "East", "South", "West"}
    return directions[d]
}
...