Go---数据类型

139 阅读4分钟

Go语言中的数据结构

go中内置的基本数据类型有int、float、bool、string等,不做太多解释,需要注意的是string在go中也是内置的基本数据类型。

1--数组

1.1--一维数组

func main() {
	// 数组
	array1 := [3]int{1, 2, 3}
	array2 := [3]int{}
	array2 = [3]int{4, 5, 6}
	fmt.Println("array1---", array1)
	fmt.Println("array2---", array2)
}

输出为

array1--- [1 2 3]
array2--- [4 5 6]

array1 := [3]int{1, 2, 3}是使用简短变量定义定义了一个数组array1,其中array1是数组名,[]中的3表示要定义的数组容量,int为数组中要存储的数据的类型,{}中的数据表示要存储的数据,用逗号分隔; array1是在定义数组的同时初始化,而array2是先定义一个数组,然后再对其进行初始化。

1.2--多维数组

如二维数组:

func main() {
	array3 := [...][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
	array4 := [4][3]int{}
	array4 = [...][3]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}
	fmt.Println("array3===", array3)
	fmt.Println("array4===", array4)
}

输出为

array3=== [[1 2 3] [4 5 6] [7 8 9]]
array4=== [[1 2 3] [4 5 6] [7 8 9] [10 11 12]]

二维数组基本上与一维数组一样,[]中的...表示长度不确定,以初始化时的长度为准,一维数组中也可这么用。

1.3--数组的局限性

  • 数组的长度和类型是在初始化的时候就固定的,即一旦定义后就不可再改变,这就很不灵活,比如我也不确定数组大小的时候,就无法使用数组了。

2--切片slice

切片是动态数组,即长度可变的数组,当数组容量不足时,会进行自动扩容,以此来适应不确定数组长度的场景,使数组变得灵活。

        slice1 := []rune{'元', '旦', '快', '乐'}
	array5 := [...]string{"元", "旦", "快", "乐"}
	slice2 := array5[:2]
	fmt.Println("slice1===", string(slice1))
	fmt.Println("slice2===", slice2)
        slice4 := make([]int, 5, 10)
	slice4 = append(slice4, 666)
	fmt.Println("slice4===", slice4)

输出为

slice1=== 元旦快乐
slice2=== [元 旦]
slice4=== [0 0 0 0 0 666]

slice1是直接定义了一个切片并初始化,其定义方法与数组类似,只是[]中不指定长度即可;slice2是从数组array5中切出来的切片,即将array5中从下标为0开始到下标为2结束之间的元素切出来,包括0但不包括2;内置方法make()可以创建一个切片,其中第一个参数表示要创建的类型,这里为int类型的切片,第二个参数表示切片底层数组的初始长度,第三个参数表示数组的初始容量,当make中没有第三个参数时,表示初始容量和初始长度一样;

ps

  • 切片是引用类型,切片变量存储的是底层数组的开始地址,即0x---,也就是说可以通过切片改变底层数组中的数据。
  • 切片的原理是动态数组,可以通过append将想要添加的元素追加到数组的末尾,当数组已满时,就按照不同的策略进行扩容,需要注意的是,append会将元素追加到数组末尾,当初始容量大于0时,数组中会有默认的零值,新元素会追加到零值的后面,如slice4所示;

3--map

map和别的语言一样,也是一种key-value键值对映射的存储方式,

        map1 := make(map[string]string, 3)
	map1["董事长"] = "张三"
	map1["总经理"] = "李四"
	map1["经理"] = "王五"
	fmt.Println(map1)

输出为

map[总经理:李四 经理:王五 董事长:张三]

map中还有一种可以判断某个键是否存在的方式,如

        map1 := make(map[string]string, 3)
	map1["董事长"] = "张三"
	map1["总经理"] = "李四"
	map1["经理"] = "王五"
	fmt.Println(map1)

	value, ok := map1["会计"]
	if ok {
		fmt.Println("目标存在--", value)
	} else {
		fmt.Println("目标不存在")
	}

	value1, ok1 := map1["总经理"]
	if ok1 {
		fmt.Println("目标存在--", value1)
	} else {
		fmt.Println("目标不存在")
	}

输出为

map[总经理:李四 经理:王五 董事长:张三]
目标不存在
目标存在-- 李四

如果不使用上面这种方式的话,如果查找到key不存在,就会返回对应类型的零值,这里为nil; 想要删除map中的元素的话可以使用内置的delete()函数,

map1 := make(map[string]string, 3)
	map1["董事长"] = "张三"
	map1["总经理"] = "李四"
	map1["经理"] = "王五"
	fmt.Println(map1)
	delete(map1, "总经理")
	fmt.Println(map1)

输出为

map[总经理:李四 经理:王五 董事长:张三]
map[经理:王五 董事长:张三]

结束语

文章仅做个人学习交流,也许并不完全正确,欢迎指正;