Я пронумеровал ваши примеры 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()
На слайсах по сравнению с массивами вы обычно создаете любой тип, требуемый для некоторой функции, которую вы вызываете.