«Это 20-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".
Перейти к изучению языка, чтобы проверить пробелы и заполнить пробелы Day2
Эта статья включена в мою колонку:«Пойдем вместе на Голанг»
Во-первых, функция возвращает параметр с именем
Пожалуйста, обратите внимание, что не так с функцией ниже?
func fun(x, y int) (s int, error) {
return x * y, nil
}
Хотя эта ошибка появится в интегрированной среде разработки Goland, другие средства разработки, такие как VS Code, не знают, появится ли она.
Мы видим этот намек: функции имеют именованные возвращаемые параметры и безымянные возвращаемые параметры.
Это означает, что когда функция имеет несколько параметров возвращаемого значения, если вы называете один параметр, другие параметры также должны быть названы. И если вы называете параметр, вы должны добавить круглые скобки к параметру, независимо от того, является ли количество параметров одним или несколькими. Здесь первый параметр называется 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)
}
Очевидно, нет, следующее сообщение об ошибке:
Как мы уже говорили ранее, новая функция 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)
}
Посмотрите, как это предложил Голанд.
Кажется, это не работает.
Тогда мы будем использовать...
Это синтаксический сахар.
Он имеет несколько функций, один из которых - разбить кусочки для передачи. Кроме того, он используется при определении функции, которая может получить любое количество параметров.
Ниже приведен текущий результат:
4. Ограничения переменных, объявленных в коротком режиме
Давайте посмотрим на следующий код. Как вы думаете, есть ли проблема?
package main
import "fmt"
var(
two = 200
)
one := 100
func main() {
fmt.Println(one,two)
}
проблематично.
Давайте поговорим об ограничениях коротких объявлений шаблонов для переменных:
- Должен использовать явную инициализацию, то есть задавать начальное значение вручную.
- Тип данных не может быть указан, компилятор автоматически выведет тип переменной на основе указанного вами начального значения.
- Переменные могут быть объявлены только с использованием короткого шаблона внутри функции.
Причина, по которой мы получаем здесь ошибку, заключается в том, что срабатывает третье указанное выше ограничение: переменная не объявлена с коротким шаблоном внутри функции.