GO语言中数组和指针

数组

Go语言提供了数组类型的数据结构。

interface{}

数组的每一个元素都是类型相同、长度固定且已经编号的,所以数组元素可以通过索引来读取(或者修改)。索引从0开始,第一个元素的索引为0,第二个元素的索引为1,以此类推。

image

数组的声明

Go语言数组的声明需要指定元素类型以及元素的个数。数组是一定要声明这个size的。语法格式如下:

var array_name [Size] array_type
aint
var a [10] int

数组的初始化

//声明并初始化
var a = [3]int{1,2,3}
//也可以通过 := 在声明数组时快速初始化数组
a := [3]int{1,2,3}
......
var a = [3]int{1,2,3}
//或者
a := [...]int{1,2,3}

如果数组已经声明过了,可以根据数组的索引给上述数组进行初始化。例如

var a [3]int //int array with length 3
a[0] = 12    // array index starts at 0
a[1] = 13
a[2] = 14
aa
package main

import "fmt"

func array() {
	var a [3]int //int array with length 3
	a[0] = 12    // array index starts at 0

	fmt.Println(a)
}
[12 0 0] 
[5]int[25]int

数组是值类型

Go语言中,数组是值类型而不是引用类型。这意味着将数组赋值给另一个新的变量时,该变量会得到一个原始数组的副本。如果对变量进行更改,是不会影响到原始数组。

package main

import "fmt"

func main() {
    a := [...]string{"hello", "world"}
    b := a 
    b[0] = "你好"
    fmt.Println("a is ", a)
    fmt.Println("b is ", b) 
}
ba
a is  [hello world]
b is  [你好 world]

数组的长度

len()
package main

import "fmt"

func main() {
    a := [...]int{5, 89, 21, 78}
    fmt.Println("length of a is",len(a))
}
length of a is 4

数组的迭代

for
for
package main
import "fmt"
func array() {
	a := [...]int{5, 89, 21, 78}
	for i := 0; i < len(a); i++ {
	fmt.Printf("数组的第%d个元素为%d ", i, a[i])
	}
}
for0len(a)-1
数组的第0个元素为5 数组的第1个元素为89 数组的第2个元素为21 数组的第3个元素为78 
range
range
rangefor
package main
import "fmt"
func array() {

	for i, v := range a {//range返回元素对应的索引和值
		fmt.Printf("数组的第 %d 个元素为 %d ", i, v)
	}
}
_
for _, v := range a { // 忽略了索引
}

指针

&*

指针的声明

一个指针变量指向了一个值的内存地址。与变量和常量类似,在使用指针前,需要声明指针。

//varName是指针变量的变量名,varType为指针类型,*号用于指定变量作为一个指针。
//*varType是指向varType类型值的指针变量类型。
var varName *varType

指针声明的示例

package main
import "fmt"
func main() {
    b := 1
    var a *int = &b
    fmt.Printf("a的类型是%T\n",a)
    fmt.Println("b的地址为",a)
}

输出结果

a的类型是*int
b的地址为 0xc000018030

Program exited.
Go中的空指针
nilnil
new()
new()new()
package main
import "fmt"
func main() {  
    //size 就是一个int型指针变量
    size := new(int)
    fmt.Printf("Size value is %d, type is %T, address is %v\n", *size, size, size)
    *size = 85
    fmt.Println("New size value is", *size)
}

解除消指针的引用

a*a

我们也可以根据指针来修改变量。

package main
import "fmt"
func main() {
	a := 1
	b := &a
    c := b
	fmt.Println("a的地址为:",b)
	fmt.Println("a的值为:",*b)
    *c++
    fmt.Println("a的值为:",a)
}

输出结果

a的地址为: 0xc000018030
a的值为: 1
a的值为: 2
abbac

注意:Go语言并不支持指针运算