GO语言学习入门笔记系列详解(五):Go语言的内建容器

GO语言学习入门笔记系列详解(五):Go语言的内建容器

数组

数组的定义和遍历

  • 二位数组数量要写在类型的前面
	var arr1 [5]int
	arr2 := [3]int{1, 3, 5}
	//让编译器帮我们数有几个int
	arr3 := [...]int{2, 4, 6, 8, 10}
	//二维数组
	var grid [4][3]int

	fmt.Println(arr1, arr2, arr3, grid)
  • 遍历数组
	//遍历数组获得元素下表和元素值
	for i := range arr3 {
		fmt.Println(arr3[i])
	}

  //遍历数组获得元素下表和元素值
	for i ,v:= range arr3 {
		fmt.Println(i,v)
	}

数组类型

  • 数组是值类型
  • [10] int 和[20] int是不同的类型
  • 调用func f(arr [10]int)会拷贝数组
  • 在go语言中一般不直接使用数组

切片

  • 几种切片方式
	arr := [...]int{0,1,2,3,4,5,6,7}
	fmt.Println("arr[2:6] = ",arr[2:6])
	fmt.Println("arr[:6] = ",arr[:6])
	fmt.Println("arr[2:] = ",arr[2:])
	fmt.Println("arr[:] = ",arr[:])
  • Slice本身没有数据,是对底层array的一个view
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	
	s := arr[2:6]
	s[0] = 10
  • arr的值变为[0,1,10,3,4,5,6,7]

  • Reslice

s := arr[2:6]
s = s[:3]
s = s[1:3]
s = arr[:]

Slice的拓展

arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
  • s1的值是多少?2,3,4,5,6

    但是还是会继续打印下标直到结束

  • s2的值是多少?5,6

    s2中还可以取出下标对应的数值。

  • slice可以向后拓展,但是不能向前拓展

  • s[i]不可以len(s),向后扩展不可以超越底层数组caps(s)

其他拓展

  • 向slice添加元素时,如果超越了cap,系统会重新分配更大的底层数组。
  • 由于值传递的关系,必须接收append的返回值
  • s = append(s,val)
  • 复制操作
copy(s2,s1)
  • 删除操作
s2 = append(s2[:3],s2[4:]...)

其他方式定义slice

//第一种
var s[]int
//第二种
s1 := [] int{2,4,6,8}
//第三种
s2 := make([] int.10,32)

Map

  • 定义:map[K]V,map[k1] map[k2]V(复合kv)
m := map[string]string {
  "name":"ccmouse"
}

var m3 map[string]int //m3 == nil
  • 遍历,使用range,遍历时无序的
for k,v ;= range m{
  fmt.println(k,v)
}
  • 如果key不存在于map中,会获取初始值没是一个空行
  • 删除元素的时候,使用delete函数

map的key

  • map使用哈希表,必须可以比较相等
  • 除了slice,map,function的内建类型都可以作为key
  • struct类型不包含上述字段,也可以作为key

map的实例

寻找最长的不含有重复字符的子串长度。

比如输入abcabcabcbb->abc

  • 对于每一个字母X:lastOccurred[x]不存在,或者<start->无需操作
  • lastOccurred[x]>=start->更新start
  • 更新lastOccurred[x],更新maxlength
func lengthOfNonRepeatingSubStr(s string) int {
	lastOccurred := make(map[byte]int)
	start := 0
	maxLength := 0
	for i, ch := range []byte(s) {
		if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
			start = start + 1
		}
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
	}
	return maxLength
}

字符和字符串的处理

  • 较底层
func main() {
	s := "Yes我爱慕课网!"
	for i, ch := range s {
		//ch is a rune
		fmt.Printf("(%d %X)", i, ch)
	}
	fmt.Println()
}

请添加图片描述

  • 较上层
	for i, ch := range []rune (s) {
		fmt.Printf("(%d %c)",i,ch)
	}
	fmt.Println()

请添加图片描述

rune相当于go的char

  • 使用range遍历pos,rune对
  • 使用utf8.RuneCountInString获得字符数量
  • 使用len获得字节长度
  • 使用[]byte获得字节

字符串其他操作

  • strings包中的工具
  • Fileds、Split、Join
  • Contains、Index
  • ToLower、ToUpper
  • Trim、TrimRight、TrimLeft
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值