Иди язык учиться проверить недостатки Days2

задняя часть Go
Иди язык учиться проверить недостатки Days2

«Это 20-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".

Перейти к изучению языка, чтобы проверить пробелы и заполнить пробелы Day2

Эта статья включена в мою колонку:«Пойдем вместе на Голанг»

Во-первых, функция возвращает параметр с именем

Пожалуйста, обратите внимание, что не так с функцией ниже?

func fun(x, y int) (s int, error) {
    return x * y, nil
}

Хотя эта ошибка появится в интегрированной среде разработки Goland, другие средства разработки, такие как VS Code, не знают, появится ли она.

image-20211120152703592

Мы видим этот намек: функции имеют именованные возвращаемые параметры и безымянные возвращаемые параметры.

Это означает, что когда функция имеет несколько параметров возвращаемого значения, если вы называете один параметр, другие параметры также должны быть названы. И если вы называете параметр, вы должны добавить круглые скобки к параметру, независимо от того, является ли количество параметров одним или несколькими. Здесь первый параметр называется s, а второй параметр не имеет имени, поэтому возникает ошибка.

2. В чем разница между new() и make()?

В Go SDK описание new выглядит так:

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

Это встроенная функция для выделения памяти, только один параметр. Если вы используете эту функцию, вы вернете указатель на вновь открытую память, которая является нулевым значением типа первого параметра.

Давайте еще раз посмотрим на make:

// The make built-in function allocates and initializes an object of type
// slice, map, or chan (only). Like new, the first argument is a type, not a
// value. Unlike new, make's return type is the same as the type of its
// argument, not a pointer to it. The specification of the result depends on
// the type:
//  Slice: The size specifies the length. The capacity of the slice is
//  equal to its length. A second integer argument may be provided to
//  specify a different capacity; it must be no smaller than the
//  length. For example, make([]int, 0, 10) allocates an underlying array
//  of size 10 and returns a slice of length 0 and capacity 10 that is
//  backed by this underlying array.
//  Map: An empty map is allocated with enough space to hold the
//  specified number of elements. The size may be omitted, in which case
//  a small starting size is allocated.
//  Channel: The channel's buffer is initialized with the specified
//  buffer capacity. If zero, or the size is omitted, the channel is
//  unbuffered.
func make(t Type, size ...IntegerType) Type

Мы можем понять, что make также выделяет память, но может выделять память только для слайсов, карт или чанов. И этот make возвращает не указатель, а значение типа, представленного вашим первым параметром.

После приведенного выше введения давайте посмотрим, можно ли скомпилировать этот код.

​
import "fmt"
​
func main() {
    l := new([]int)
    l = append(l, 0)
    fmt.Println(l)
}
​

Очевидно, нет, следующее сообщение об ошибке:

image-20211120154559775

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

3. Проблема добавления слайсов к слайсам

Если есть два фрагмента, как я могу использовать append, чтобы объединить их в один фрагмент?

Будет ли это работать?

package main
​
import "fmt"
​
func main() {
    slice := []int{8, 8, 8}
    append_slice := []int{2, 8}
    slice = append(slice, append_slice)
    fmt.Println(slice)
}
​

Посмотрите, как это предложил Голанд.

image-20211120155228653

Кажется, это не работает.

Тогда мы будем использовать...Это синтаксический сахар.

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

Ниже приведен текущий результат:

image-20211120155606933

4. Ограничения переменных, объявленных в коротком режиме

Давайте посмотрим на следующий код. Как вы думаете, есть ли проблема?

package main
​
import "fmt"
​
​
var(
    two = 200
)
one := 100
​
func main() {
    fmt.Println(one,two)
}

проблематично.

Давайте поговорим об ограничениях коротких объявлений шаблонов для переменных:

  1. Должен использовать явную инициализацию, то есть задавать начальное значение вручную.
  2. Тип данных не может быть указан, компилятор автоматически выведет тип переменной на основе указанного вами начального значения.
  3. Переменные могут быть объявлены только с использованием короткого шаблона внутри функции.

Причина, по которой мы получаем здесь ошибку, заключается в том, что срабатывает третье указанное выше ограничение: переменная не объявлена ​​с коротким шаблоном внутри функции.