第六届字节跳动青训营走进Go基础语法(下) | 青训营

88 阅读3分钟

2.6 数组

Go中的数组使用较少,更多使用切片,因为数组的长度是固定的 数组用法与C++中类似,也可以定义多维数组,要注意的是Go中的数组同C++一样是从0开始到N-1的,如果遍历到N会越界

	var a [5]int
	for i := 0; i <= 4; i++ {
		a[i] = i
	}
	for i := 0; i <= 4; i++ {
		fmt.Println(a[i])
	}

2.7 切片(Slice)

切片不同于数组,是一个可变长度的数组(动态数组),类似于C++中的vector

2.7.1切片的声明

切片的声明一般用make函数,格式为 "变量名" + ":=" + "make([]类型名, 切片初始大小)" 其中整型的初始值是0,字符串的初始值是空格

	a := make([]int, 5)
	s := make([]string, 6)

2.7.2切片追加元素

在切片末尾追加元素,有点类似C++中的push_back,使用append函数时要注意必须把append的值赋值回原数组,切片大小也跟着改变

	a := make([]int, 5)
	a = append(a, 5, 6, 7, 8)
	fmt.Println(a)

2.7.3 切片的复制

可以使用copy来复制一个数组的值到另一个数组,如果被复制的数组长度大于复制的将会只复制一部分值

	a := make([]int, 5)
	a = append(a, 5, 6, 7, 8)
	b := make([]int, len(a))
	copy(b, a)

2.7.4 切片操作

感觉跟MATLAB和Python差不多,这样输出会很方便

	fmt.Println(b[2:3])
	fmt.Println(b[:3])
	fmt.Println(b[2:])

2.8 map(哈希/字典)

使用make函数来定义map,与C++中的map差不多

	mp := make(map[int]int)
	mp[1] = 2
	mp[2] = 3

使用第二个值来查询键值对有没有被赋值过,其中ff返回一个布尔型的变量

	val,ff := mp[3]
	fmt.Println(val,ff)

删除键值对时使用delete函数

	delete(mp,1)

2.9 range

range 可以用来遍历切片,map等集合,使代码更加简洁

在遍历切片时,可以用两个变量来获取索引及该索引上的值,如不需要获取索引可以用下划线代替

	a := []int{1,2,3,4}
	for idx,val := range a{
		fmt.Println(idx,val)
	}

在遍历map时,第一个值是key,第二个值是value,单个值时只获取key

	mp := map[string]int{"a": 1, "b": 2}
	for k, v := range mp {
		fmt.Println(k, v)
	}

2.10 函数

与C++中的函数大致相同,只是类型声明后置,

package main

import (
	"fmt"
)

func mian(a, b int) int {
	return a * b
}
func main() {
	a := mian(4, 6)
	fmt.Println(a)
}

函数也同样可以返回多个值

package main

import (
	"fmt"
)

func test_mian(a, b int) (ans int, ok bool) {
	ans = b
	ok = false
	return ans, ok
}
func main() {
	a, ff := test_mian(4, 6)
	fmt.Println(a, ff)
}

2.11 结构体

具体用法与C++大致相同,可以在定义时就把结构体内变量赋值,使代码更简洁

package main

import (
	"fmt"
)

type Node struct {
	name  string
	point int
}

func main() {
	d := Node{name: "Go", point: 100}
	d.point = 99
	fmt.Println(d.name, d.point)
}

总结

在Go中,数组是固定长度的,索引从0开始。切片是动态数组,使用make函数进行声明,可通过append进行元素追加,还可以使用copy进行复制,支持切片操作,类似MATLAB和Python。使用make函数可以定义映射(map),用于存储键值对。通过查询返回的第二个值可以判断是否存在该键。使用delete函数可删除键值对。在循环遍历方面,range可用于遍历切片、映射等集合,使代码简洁。对于切片,可以同时获取索引和值,而在映射中,第一个值是键,第二个值是值。函数的定义类似C++,可以返回单个值或多个值。结构体定义也类似C++,可以在声明时进行初始化。