数组
- 可通过省略变量
- 不仅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
}