为了账号安全,请及时绑定邮箱和手机立即绑定

【Go语言干货】从入门说起,你不得不要知道的内建容器

数组

  • 可通过省略变量
  • 不仅range,任何地方都可通过省略变量
  • [10]int和[20]int是不同类型
  • 调用func f(arr[10]int)会拷贝数组
  • GO数组是值类型
    • 使用引用
    • 不直接使用数组,使用切片
package main

import "fmt"

func printArray(arr [5]int) {
	arr[0] = 100
	for i, v := range arr {
		fmt.Println(i, v)
	}
}

func main() {
	var arr1 [5]int
	arr2 := [3]int{1, 3, 5}
	arr3 := [...]int{2, 4, 6, 8, 10}
	var grid [4][5]int
		
	numbers:=[6]int{1,3,2,5,8,4}
		for i:=0;i< len(numbers);i++{
			fmt.Println(numbers[i])
	}


	fmt.Println("array definitions:")
	fmt.Println(arr1, arr2, arr3)
	fmt.Println(grid)

	fmt.Println("printArray(arr1)")
	printArray(arr1)

	fmt.Println("printArray(arr3)")
	printArray(arr3)

	fmt.Println("arr1 and arr3")
	fmt.Println(arr1, arr3)
}

切片 (Slice)

  • Slice本身没有数据,是对底层array的一个view
arr:=[...Jint{0,1,2,3,4,5,6,7}
s:=arr[2:6]
s的值为[2 3 4 5]
arr:=[...Jint{0,1,2,3,4,5,6,7}
s:=arr[2:6]
s[0]=10
arr的值变为[011034567]

Reslice

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

slice的扩展

图片描述

slice的实现

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

图片描述

slice操作

  • 添加元素时如果超越cap,系统会重新分配更大的底层数组
  • 之前的数组如果没有使用就会被回收
  • 由于值传递的关系,必须接收append的返回值
package main

import "fmt"

func printSlice(s []int) {
	fmt.Printf("%v, len=%d, cap=%d\n",
		s, len(s), cap(s))
}

func sliceOps() {
	fmt.Println("Creating slice")
	var s []int // Zero value for slice is nil

	for i := 0; i < 100; i++ {
		printSlice(s)
		s = append(s, 2*i+1)
	}
	fmt.Println(s)

	s1 := []int{2, 4, 6, 8}
	printSlice(s1)

	s2 := make([]int, 16)
	s3 := make([]int, 10, 32)
	printSlice(s2)
	printSlice(s3)

	fmt.Println("Copying slice")
	copy(s2, s1)
	printSlice(s2)

	fmt.Println("Deleting elements from slice")
	s2 = append(s2[:3], s2[4:]...)
	printSlice(s2)

	fmt.Println("Popping from front")
	front := s2[0]
	s2 = s2[1:]

	fmt.Println(front)
	printSlice(s2)

	fmt.Println("Popping from back")
	tail := s2[len(s2)-1]
	s2 = s2[:len(s2)-1]

	fmt.Println(tail)
	printSlice(s2)
}

Map

  • 创建:make(map[stringlint)
  • 获取元素:m[key]
  • key不存在时,获得Value类型的初始值
  • 用value,ok:=m[key]来判断是否存在key
  • 用delete删除一个key
  • map[K]V,map[K1]map[k2]V(可以进行复合map)
  • 使用range 遍历key,或者遍历key,value对
  • 不保证遍历顺序,如需顺序,需手动对key排序
  • 使用len获得元素个数
  • map使用哈希表,必须可以比较相等
  • 除了slice,map,function的内建类型都可以作为key
  • Struct类型不包含上述字段,也可作为key
  • rune 相当于go的char
    • 使用range 遍历pos,rune对
    • 使用utf8.RuneCountinString获得字符数量
    • 使用len获得字节长度
    • 使用[]byte获得字节
  • 其他字符串操作
    • Fields,Split,Join
    • Contains,Index
    • ToLower,ToUpper
    • Trim,TrimRight,TrimLeft

图片描述

func main() {
	m := map[string]string{
		"name":    "ccmouse",
		"course":  "golang",
		"site":    "imooc",
		"quality": "notbad",
	}

	m2 := make(map[string]int) // m2 == empty map

	var m3 map[string]int // m3 == nil

	fmt.Println("m, m2, m3:")
	fmt.Println(m, m2, m3)

	fmt.Println("Traversing map m")
	for k, v := range m {
		fmt.Println(k, v)
	}

	fmt.Println("Getting values")
	courseName := m["course"]
	fmt.Println(`m["course"] =`, courseName)
	if causeName, ok := m["cause"]; ok {
		fmt.Println(causeName)
	} else {
		fmt.Println("key 'cause' does not exist")
	}

	fmt.Println("Deleting values")
	name, ok := m["name"]
	fmt.Printf("m[%q] before delete: %q, %v\n",
		"name", name, ok)
	delete(m, "name")
	name, ok = m["name"]
	fmt.Printf("m[%q] after delete: %q, %v\n",
		"name", name, ok)
}

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

  • abcabcbb>abc
  • bbbbb>b
  • pwwkew>wke
    图片描述

对于每一个字母x

  • lastOccurred[x]不存在,或者<start>无需操作
  • lastOccurred[x]>=start -> 更新start
  • 更新lastOccurred[x],更新maxLength
  • map保存每个字母最后出现的位置
  • 字符串从左往右开始扫描,开始位置记为start,用x标记当前扫描到的字符,lastOccurred[x]标记字母最后出现的位置。maxLength标记当前已扫描最长字符串长度
func lengthOfNonRepeatingSubStr(s string) int {
	// 当前扫描到到字母,最后出现到位置
	lastOccurred := make(map[rune]int)
	//最大连续不重复字符串开始位置
	start := 0
	//最大连续不重复字符串长度
	maxLength := 0

	for i, ch := range []rune(s) {
		// lastOccurred不一定存在,零,但是合法,所以加上ok判断
		if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
			start = lastI + 1
		}
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
	}

	return maxLength
}

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消