go基础笔记----内建容器

  • 数组

package main

import "fmt"

// 求数组最大值
func maxValue(arr []int) (int, int) {
	maxi := -1
	maxValue := -1
	for i, val := range arr {
		if val > maxValue {
			maxi, maxValue = i, val
		}
	}
	return maxi, maxValue
}

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

func main() {
	// go语言中一般不适用数组,一般使用切片
	// 定义数组
	var arr1 [5]int
	arr2 := [3]int{1, 2, 3}          // := 要赋初始值
	arr3 := [...]int{3, 4, 4, 6, 76} //让编译器来计算数量

	// 二维数组
	var grid [4][5]int //4个长度为5的int数组

	fmt.Println(arr1, arr2, arr3)
	fmt.Println(grid)

	// for循环遍历数组
	for i := 0; i < len(arr3); i++ {
		fmt.Println(arr3[i])
	}

	// range遍历数组
	for _, v := range arr3 {
		fmt.Println(v)
	}

	/* php foreach遍历数组
	foreach(array as $k=>$v)
	{
		echo $k;
		echo $v
	}*/

	// 数组求最大值 通过切片传递
	fmt.Println(maxValue(arr3[:]))

	// 数组是值类型,也就是传输方式会是拷贝而不是修改元数据,想类似于引用传递可以使用指针
	printArray(&arr3)

}
  • 切片与切片操作

package main

import "fmt"

func updateSlice(s []int) {
	s[0] = 100
}

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

//Slice 切片(很重要) 前闭后开
func main() {
	// 定义array
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}

	// 取切片Slice Slice是对原本array的view,类似于引用
	fmt.Println("arr[2:6] :", arr[2:6]) // print [2 3 4 5]
	fmt.Println("arr[:6] :", arr[:6])   // print [0 1 2 3 4 5]
	fmt.Println("arr[2:] :", arr[2:])   // print [2 3 4 5 6 7]
	fmt.Println("arr[:] :", arr[:])     // print [0 1 2 3 4 5 6 7]

	s1 := arr[2:]
	fmt.Println("s1 =", s1)

	s2 := arr[:]
	fmt.Println("s2 =", s2)

	fmt.Println("After updateSlice(s1)")
	updateSlice(s1)
	fmt.Println(s1)
	fmt.Println(arr)

	fmt.Println("After updateSlice(s2)")
	updateSlice(s2)
	fmt.Println(s2)
	fmt.Println(arr)

	// 切片重组 reslice
	fmt.Println("reslice")
	fmt.Println(s2)
	s2 = s2[:5]
	fmt.Println(s2)
	s2 = s2[2:]
	fmt.Println(s2)

	// Slice拓展 slice底层实现包括 1.ptr:指针 2.len:数组长度 3.cap:在cap范围内都可以进行拓展
	// slice可以向后拓展,不可以向前拓展. s[i]不可以超越len(s),向后拓展不可以超越底层数组cap(s)
	fmt.Println("Extending slice")
	fmt.Println(arr)
	arr[0], arr[2] = 0, 2
	s1 = arr[2:6] // print [2 3 4 5]
	s2 = s1[3:5]  // print [5 6]
	fmt.Println("arr =", arr)
	fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d \n",
		s1, len(s1), cap(s1)) // s1=[2 3 4 5], len(s1)=4, cap(s1)=6
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d \n",
		s2, len(s2), cap(s2)) // s2=[5 6], len(s2)=2, cap(s2)=3

	// slice append
	fmt.Println("append start")
	fmt.Println(s2)
	s3 := append(s2, 10)
	s4 := append(s3, 11)
	s5 := append(s4, 12)
	fmt.Println("s3, s4, s5 =", s3, s4, s5)
	// s4 and s5 no longer view arr 系统开辟空间填充数据
	// 添加元素时如果超越cap, system会重新分配更大的底层数组,将原来的元素拷贝过去,如果原数组被用到则存在,否则垃圾回收掉
	// 由于值传递的关系,必须接收append的值  s = append(s, val)
	fmt.Println("arr =", arr)

	// 创建slice
	// 1
	var s []int // Zero value for slice is nil  s == nil
	for i := 0; i < 100; i++ {
		printSlice(s) //cap扩充为*2扩充
		s = append(s, 2*i+1)
	}
	fmt.Println(s)

	// 新建有初始值的slice
	st := []int{2, 4, 6, 8}
	printSlice(st)

	// 新建固定长度的slice 第一个参数为len长度,第二个为cap的长度,默认填写一个会新建len=cap的slice
	st1 := make([]int, 16, 32)
	printSlice(st1)

	// slice复制
	copy(st1, st)
	printSlice(st1)

	// slice删除
	st1 = append(st1[:3], st1[4:]...)
	printSlice(st1)

	// 删除slice头
	front := st1[0]
	st1 = st1[1:]
	println(front)
	printSlice(st1)

	// 删除slice尾
	tail := st1[len(st1)-1]
	st1 = st1[:len(st1)-1]
	println(tail)
	printSlice(st1)

}
  • map与例题

package main

import (
	"fmt"
	"unicode/utf8"
)

// 寻找最长不含有重复字符的字串
func lengthOfNonRepeatingSubStr(s string) int {
	// map
	lastOccurred := make(map[byte]int)
	// 开始
	start := 0
	// 最大长度
	maxLength := 0
	// i为字符的位置 ch为字符的access码值
	for i, ch := range []byte(s) {
		// 判断map里面是否有当前字符
		lastI, ok := lastOccurred[ch]
		if ok && lastI >= start {
			start = lastOccurred[ch] + 1
		}
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
		fmt.Println(lastOccurred)
	}
	return maxLength
}

// 寻找最长不含有重复字符的字串(国际版)
func lengthOfNonRepeatingWorldSubStr(s string) int {
	// map
	lastOccurred := make(map[rune]int)
	// 开始
	start := 0
	// 最大长度
	maxLength := 0
	// i为字符的位置 ch为字符的access码值
	for i, ch := range []rune(s) {
		// 判断map里面是否有当前字符
		lastI, ok := lastOccurred[ch]
		if ok && lastI >= start {
			start = lastOccurred[ch] + 1
		}
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
		fmt.Println(lastOccurred)
	}
	return maxLength
}

func main() {
	/*
		   定义map格式
		   m := map[key_type]value_type {
			   "key": "value",
			   "key": "value",
		   }
		   复合map定义
		   map[key1]map[k2]value
	*/
	m := map[string]string{ // key在map里面是无序的
		"lmf": "lfx",
		"yxs": "xd",
	}

	fmt.Println(m)

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

	var m3 map[string]int // m3 == nil
	fmt.Println(m3)

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

	// 获取map值 如何不存在key则返回空值
	fmt.Println("Getting values")
	if lmf, ok := m["lmf"]; ok {
		fmt.Println("map key exist")
		fmt.Println(lmf)
	} else {
		fmt.Println("map key does not exist")
	}

	// map删除元素
	fmt.Println("Deleteing values")
	delete(m, "lmf")
	for k, v := range m {
		fmt.Println(k, v)
	}

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

	// 寻找最长不含有重复字符的字串
	fmt.Println(lengthOfNonRepeatingSubStr("pwwwkew"))

	/*
	 rune相当于go的char
	 使用range来遍历[]rune[str] rune对
	 使用utf8.RuneCountInString获得字符数量,使用len()获得的是字节长度
	 使用[]byte获得字节
	 使用range []rune[str]会重新开辟一块run slice内存
	*/
	sr := "Yes我爱慕课网!" // UTF-8
	for _, b := range []byte(sr) {
		fmt.Printf("%X", b)
	}

	fmt.Println()
	for i, ch := range sr { // ch is a rune
		fmt.Printf("(%d %x)", i, ch)
	}

	fmt.Println()
	fmt.Println("Rune count:",
		utf8.RuneCountInString(sr))

	bytes := []byte(sr)
	for len(bytes) > 0 {
		ch, size := utf8.DecodeRune(bytes)
		bytes = bytes[size:]
		fmt.Printf("%c ", ch)
	}

	fmt.Println()
	for i, ch := range []rune(sr) { //重新开辟一块rune内存,也是将uncode转utf-8
		fmt.Printf("(%d %c) ", i, ch)
	}

	fmt.Println("\n World lenght ")
	// 国际版查找最长字符字串长度
	fmt.Println(lengthOfNonRepeatingWorldSubStr("我爱你祖国国2"))
	fmt.Println()

	//字符串操作 strings Fields(去除空格),Split,Join,Contains,Index,Tolower,ToUpper,Trim,TrimRight,TrimLeft
	/*
		// 子串substr在s中,返回true
		func Contains(s, substr string) bool
		// chars中任何一个Unicode代码点在s中,返回true
		func ContainsAny(s, chars string) bool
		// Unicode代码点r在s中,返回true
		func ContainsRune(s string, r rune) bool
	*/

}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值