В массивах go длина является частью типа данных [3]int *[3]int
Примечания и подробности использования массивов
1) Массив представляет собой комбинацию нескольких данных одного типа. После объявления/определения массива его длина фиксируется и не может быть изменена динамически.
var a [3]int
a[0] =1.1 这样是不行的,必须是整数
2) var arr[ ]int тогда arr — это срез ( если в [] не указан размер, то это срез )
3) Элементы массива могут иметь любой тип данных, включая типы значений и ссылочные типы , но их нельзя смешивать.
var b = [10]*int{&i, &j, &k}
fmt.Println(len(b))
fmt.Println(*b[0], *b[1], *b[2])
0xc0000a60f8 0xc0000a6100 0xc0000a6108
4) После создания массива, если значение не присвоено, существует значение по умолчанию. Массив числового типа: значение по умолчанию — 0. Строковый массив: значение по умолчанию — «». Массив Bool: значение по умолчанию — false (в на самом деле, когда массив определен, пространство уже выделено. Просто используйте значение по умолчанию, не назначая его)
5) Шаги по использованию массива: 1. Объявите массив и освободите пространство. 2. Присвойте значение каждому элементу массива ( не присвоение значения означает использование нулевого значения по умолчанию ). 3. Использование массива.
6) Индексы массивов начинаются с 0.
7) Индексы массива должны использоваться в пределах указанного диапазона, иначе будет сообщено о панике: массив выходит за пределы, например, var arr [5]int, допустимые индексы 0-4
8) Массив Go — это тип значения. По умолчанию он передается по значению, поэтому копирование значений будет выполняться и массивы не будут влиять друг на друга.
func Test(t [5]int) {
fmt.Printf("%p\n", &t)
}
c := [5]int{1, 2, 3, 4, 5}
fmt.Printf("%p\n", &c)
Test(c)
0xc00012a030
0xc00012a060
Примечание. [3]int — это тип данных, а длина также является типом данных. [3]int [4]int — это разные типы данных.
9) Если вы хотите изменить исходный массив в других функциях, вы можете использовать передачу ссылок (метод указателя) [Сначала попробуйте и нарисуйте диаграмму]
func Test(t *[5]int) {
fmt.Printf("%p \n", t)
fmt.Println((*t)[0], (*t)[1], (*t)[2], (*t)[3], (*t)[4])
(*t)[0] = 100
}
func main() {
c := [5]int{1, 2, 3, 4, 5}
fmt.Printf("%p \n", &c)
Test(&c)
fmt.Println(c)
}
0xc00000e4e0
0xc00000e4e0
1 2 3 4 5
[100 2 3 4 5]
a *[3]int a представляет указатель на массив типа [3]int.
Один из них — копия значения, а другой — указатель.Если данные очень большие, копирование значений требует очень много ресурсов.
Если вы хотите изменить только внешний массив с помощью массива, используйте передачу указателя, которая является эффективной и быстрой.
Первый не удается скомпилировать: при передаче массива длина является частью типа. Здесь массив разрезается, и компиляция завершается неудачно.
Вторая ошибка: длина является частью типа данных, длина отличается, [3]int отличается от типа [4]int
Третий правильный