Предпочтительный метод объявления / инициализации - PullRequest
3 голосов
/ 18 октября 2010

Я сейчас играю с Google Go.
Есть много способов объявить и / или инициализировать переменные.
Может кто-нибудь объяснить плюсы / минусы каждого способа (образцы, насколько я знаю, ниже):

    var strArr0 *[10]string = new([10]string)

    var strArr1 = new([10]string)

    var strArr2 = make([]string,10)

    var strArr3 [10]string

    strArr4 := make([]string,10)

Какой синтаксис вы предпочитаете и почему?
Спасибо, ТАК, ребята!

Ответы [ 2 ]

7 голосов
/ 02 ноября 2010

Я пронумеровал ваши примеры 1-5, и я рассмотрю их здесь.Надеюсь, это поможет!

var strArr0 *[10]string = new([10]string)  // (1)

Это выделяет новый массив строк длиной 10 и возвращает указатель на массив.

var strArr1 = new([10]string)  // (2)

Это точно так же, как 1.Это просто сокращение, которое работает из-за логического вывода типа Go.Это может быть сокращено далее до:

strArr1 := new([10]string)  // (2a)

, где 1, 2, 2a все дают точно такой же результат.

var strArr2 = make([]string,10)  // (3)

Это дает фрагмент строк длиной 10. AСрез относится к некоторому подмножеству базового массива.Начиная с спецификации golang :

Вызов make () выделяет новый скрытый массив, к которому относится возвращаемое значение слайса.

make([]T, length, capacity)

создает тот же фрагмент, что и выделение массива и его разделение, поэтому эти два примера приводят к одному и тому же фрагменту:

make([]int, 50, 100)
new([100]int)[0:50]

Так что 3 эквивалентно любомуиз следующих:

var strArr2 = new([10]string)[0:10]  // Slicing an explicitly created array
var strArr2 []string = new([10]string)[0:10]  // Explicitly declaring the type of strArr2, rather than inferring
strArr2 := new([10]string)[0:10]  // Using the := shorthand instead of var

new или make используются в зависимости от того, какой тип вы создаете.make используется исключительно для слайсов, карт и каналов.Они использовали другое ключевое слово, чтобы передать идею, что make инициализирует некоторую структуру данных, а не просто обнуляет память.

Следующее возвращается к массивам, а не к слайсам:

var strArr3 [10]string  // (4)

Это то же самое, что 1, 2 и 2a.

strArr4 := make([]string,10)  // (5)

То же, что и 3.: = это просто сокращение при инициализации переменной, и тип может быть выведен.


Так что же выбрать?Это немного зависит от вашего личного стиля, но, в общем, один выбор, очевидно, позволит максимизировать ясность вашего кода, например, использование вывода типа, когда тип очевиден:

foo := bar.ToStringArray()

или объявление типов, когда этоменьше, и тип будет полезен для просмотра:

var foo []string = bar.DoSomethingOpaque()

На слайсах по сравнению с массивами вы обычно создаете любой тип, требуемый для некоторой функции, которую вы вызываете.

2 голосов
/ 18 октября 2010

Прежде всего вы должны понять различие между массивами и слайсами. Массивы обрабатываются как значения, поэтому, если вы передадите их функциям, они будут скопированы. Слайсы, с другой стороны, являются ссылками на базовый массив, поэтому если вы передадите слайс функции, переменная функции все равно будет ссылаться на тот же базовый массив.

В ваших примерах первые два идентичны, просто первый указывает тип в объявлении переменной. Давайте сделаем это, и это может помочь в некоторых случаях - например, когда вы пытаетесь объявить переменную как интерфейс вместо значения (т.е. .

Третий и пятый (var strArr2 = make([]string,10), strArr4 := make([]string,10) эквивалентны, но последний использует сокращенную форму объявления переменных, что часто может сэкономить много печатать.

Четвертый просто объявляет значение массива.

Я редко имею дело с массивами в моем коде, если я не работаю с сетевыми данными. Поэтому мой предпочтительный синтаксис:

s := make([]string, 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...