golang学习笔记系列之复杂数据类型

复杂数据类型

数组

数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组 可以通过索引来访问元素。

数组的定义
var array_name [SIZE]TYPE
  • array_name:数组名
  • SIZE:数组的大小
  • TYPE:数组中数据的类型
type Student struct {
	Name string
	num  int
}
// 数组的定义
var arr_int [10]int
fmt.Printf("arr_int: %v\n", arr_int)
var arr_str [10]Student
fmt.Printf("arr_str: %v\n", arr_str)

运行结果

arr_int: [0 0 0 0 0 0 0 0 0 0]
arr_str: [{ 0} { 0} { 0} { 0} { 0} { 0} { 0} { 0} { 0} { 0}]
数组的初始化

初始化就是给数组的元素赋初值,没有初始化的数组,默认元素都是零值(数值型的默认值是0,布尔型的默认值所示false,字符串型的默认值是空字符)。

//给数组赋初始值
	var arr_int_init = [10]int{1, 2, 3}
	fmt.Printf("arr_int_init: %v\n", arr_int_init)

	//给指定位置赋初始值
	var arr_float_init = [10]float64{0: 100.0, 3: 200.0}
	fmt.Printf("arr_float_init: %v\n", arr_float_init)

	//使用...不指定数组的大小,根据初始值来判断数组的大小
	var arr_string_init = [...]string{"hello", "world"}
	fmt.Printf("arr_string_init: %v\n", arr_string_init)

运行结果

arr_int_init: [1 2 3 0 0 0 0 0 0 0]
arr_float_init: [100 0 0 200 0 0 0 0 0 0]
arr_string_init: [hello world]
数组的访问

可以通过索引的方式来访问数组。数组的最大下标为数组的长度减一,最小为0,大于这个值会发生数组越界。

package main

import "fmt"

func main() {

	var arr_int = [10]int{1, 2, 3, 4, 5, 6}

	//访问第一个元素
	fmt.Printf("arr_int[0]: %v\n", arr_int[0])

	//访问第3个元素
	fmt.Printf("arr_int[2]: %v\n", arr_int[2])

	//访问最后一个元素
	fmt.Printf("arr_int[len(arr_int)-1]: %v\n", arr_int[len(arr_int)-1])

	//for遍历数组
	for i := 0; i < len(arr_int); i++ {

		fmt.Printf("a[%v]=%v \n", i, arr_int[i])

	}
	print("#########################################\n")
	//for range遍历数组
	for i, v := range arr_int {
		fmt.Printf("a[%v]=%v \n", i, v)

	}
}

运行结果

arr_int[0]: 1
arr_int[2]: 3
arr_int[len(arr_int)-1]: 0
a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 
a[5]=6 
a[6]=0 
a[7]=0 
a[8]=0 
a[9]=0 
#########################################
a[0]=1 
a[1]=2 
a[2]=3 
a[3]=4 
a[4]=5 
a[5]=6 
a[6]=0 
a[7]=0 
a[8]=0 
a[9]=0 

切片

和数组类似,切片也是一组相同数据类型的数据的集合,但与数组不一样的是,切片的长度是可变的。对于数组来说,当我们对要保存的元素的个数不确定时,如果申请太小的数组,可能就不够用;如果申请太大的数组,可能就造成了不必要的浪费。鉴于这个原因,就有了切片,我们可以把切片理解为可变长度的数组,其实它底层就是使用数组实现的,只不过增加了一个自动扩容功能。

切片的定义

语法1

var slice_name []TYPE
  • slice_name:切片名
  • TYPE:切片类型

语法2

//使用make函数定义切片时,会同时将切片初始化
slice_name := make([]TYPE,SIZE)
  • slice_name:切片名
  • TYPE:切片中元素的类型
  • SIZE:初始化切片的大小
package main

import "fmt"

func main() {

	//切片的定义
	var s1 []int
	s1 = append(s1, 1)
	fmt.Printf("s1: %v\n", s1)

	//make定义切片的同时会将其初始化
	s2 := make([]string, 10)
	fmt.Printf("s2: %v\n", s2)

	//访问切片中的元素
	fmt.Printf("s1[0]: %v\n", s1[0])

	//在切片的末尾添加元素
	s1 = append(s1, 2)
	fmt.Printf("s1: %v\n", s1)
	//修改切片中的元素
	s1[0] = 100
	fmt.Printf("s1: %v\n", s1)

	//获取切片的大小
	fmt.Printf("len(s1): %v\n", len(s1))

	fmt.Printf("cap(s1): %v\n", cap(s1))

}

运行结果

s1: [1]
s2: [         ]
s1[0]: 1
s1: [1 2]
s1: [100 2]
len(s1): 2
cap(s1): 2
切片的初始化
package main

import "fmt"

func main() {

	//切片的初始化
	//方法一
	var s1 = []int{1, 2, 3}
	fmt.Printf("s1: %v\n", s1)

	//方法二:make
	s2 := make([]int, 10)
	fmt.Printf("s2: %v\n", s2)

	//方法三:借助数组
	arr := [3]int{1, 2, 3}
	s3 := arr[:]
	fmt.Printf("s3: %v\n", s3)

	//切片/数组/字符串的切片操作: s[a:b] 左闭右开 于python不一样的是,go语言中不能修改步长,步长只能是1
	s4 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	fmt.Printf("s4[1:9]: %v\n", s4[1:3])
    
    //访问操作和遍历操作同数组
}

运行结果

s1: [1 2 3]
s2: [0 0 0 0 0 0 0 0 0 0]
s3: [1 2 3]
s4[1:9]: [2 3]
切片的crud操作
package main

import (
	"fmt"
)

func main() {

	s := []int{1, 2, 3, 4, 5}

	//add
	s = append(s, 1)
	fmt.Printf("s: %v\n", s)

	//delete:删除索引为index的元素
	index := 2
	s = append(s[:index], s[index+1:]...)
	fmt.Printf("s: %v\n", s)

	//update
	s[4] = 6
	fmt.Printf("s: %v\n", s)

	//query
	target := 5
	for i, v := range s {
		if v == target {
			println("找到了!", i)
			break
		}

	}

}

运行结果

s: [1 2 3 4 5 1]
s: [1 2 4 5 1]
s: [1 2 4 5 6]
找到了! 3

map

map是一种key:value键值对的数据结构。map内部实现是hash表。map最重要的一点是通过key能够快速的检索出数据。

map的定义
var m[K_TYPE]V_TYPE
  • m:map名
  • K_TYPE:key的类型
  • V_TYPE:value的类型
package main

import (
	"fmt"
)

func main() {

	//map的定义
	//方法一
	var m1 map[string]string
	fmt.Printf("m1: %v\n", m1)

	//方法二
	m2 := make(map[string]string)
	fmt.Printf("m2: %v\n", m2)

	//map的初始化
	var m3 = map[string]string{
		"name": "Tom",
		"age":  "18",
	}
	fmt.Printf("m3: %v\n", m3)

	//增加/修改map
	m3["num"] = "1234"
	m3["age"] = "20"
	fmt.Printf("m3: %v\n", m3)

	//根据k获取v
	fmt.Printf("m3[\"name\"]: %v\n", m3["name"])

	//判断某个k是否存在  v,ok=m[k]--->如果k存在,ok为true,否则为false
	v, ok := m3["name"]
	if ok {
		print(v)
	}

	//删除某个k
	delete(m3, "age")
	fmt.Printf("m3: %v\n", m3)
}

运行结果

m1: map[]
m2: map[]
m3: map[age:18 name:TOm]
m3: map[age:20 name:TOm num:1234]
m3["name"]: TOm
TOmm3: map[name:TOm num:1234]
map的遍历

通过for range对map进行遍历。

package main

import "fmt"

func main() {

	var m = map[string]string{
		"name": "Tom",
		"age":  "18",
		"num":  "1234",
	}

	//for range遍历
	//1.只拿到key
	for k := range m {
		fmt.Printf("k: %v v: %v\n", k, m[k])
	}

	//2.同时拿到k和v
	for k, v := range m {
		fmt.Printf("k: %v v: %v\n", k, v)
	}

}

运行结果

k: name v: Tom
k: age v: 18
k: num v: 1234
k: num v: 1234
k: name v: Tom
k: age v: 18

同步更新于个人博客系统:golang学习笔记系列之复杂数据类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值