go数据结构笔记
常用数据结构
切片
定义int类型,大小为3 长度为10
切片的数据结构可以类比成ArrayList,具备动态扩容的数组
package main
import "fmt"
func main() {
var numbers = make([]int, 3, 10) //切片类型为int 长度为3 容量为10
printSlice(numbers)
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
看下打印的数据
切片初始化不指定大小和容量
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
if numbers == nil {
fmt.Println("切片是空的")
}
}
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
打印
切片的截取
可以类比成String的subString
package main
import "fmt"
func main() {
/* 创建切片 */
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
/* 打印原始切片 */
fmt.Println("numbers ==", numbers)
/* 打印子切片从索引1(包含) 到索引4(不包含)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* 默认下限为 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* 默认上限为 len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
numbers1 := make([]int,0,5)
printSlice(numbers1)
/* 打印子切片从索引 0(包含) 到索引 2(不包含) */
number2 := numbers[:2]
printSlice(number2)
/* 打印子切片从索引 2(包含) 到索引 5(不包含) */
number3 := numbers[2:5]
printSlice(number3)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
打印
切片的append() 和 copy() 函数
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */
numbers = append(numbers)
printSlice(numbers)
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
printSlice(numbers)
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
打印
map
这里可以类比成Java的Hashmap,同样不是线程安全的
package main
import (
"fmt"
)
func main() {
//第一种声明
var test1 map[string]string
//在使用map前,需要先make,make的作用就是给map分配数据空间
test1 = make(map[string]string, 10) //key 和value均 string
test1["one"] = "js"
test1["two"] = "golang"
test1["three"] = "java"
fmt.Println(test1) //map[two:golang three:java one:js]
//第二种声明
test2 := make(map[string]string)
test2["one"] = "js"
test2["two"] = "golang"
test2["three"] = "java"
fmt.Println(test2) //map[one:js two:golang three:java]
//第三种声明
test3 := map[string]string{
"one": "js",
"two": "golang",
"three": "java",
}
fmt.Println(test3) //map[one:js two:golang three:java]
language := make(map[string]map[string]string)
language["js"] = make(map[string]string, 2)
language["js"]["id"] = "1"
language["js"]["desc"] = "js是世界上最美的语言"
language["golang"] = make(map[string]string, 2)
language["golang"]["id"] = "2"
language["golang"]["desc"] = "golang抗并发非常good"
fmt.Println(language) //map[js:map[id:1 desc:js是世界上最美的语言] golang:map[id:2 desc:golang抗并发非常good]]
//增删改查
val, key := language["js"] //查找是否有js这个子元素
if key {
fmt.Println("%v", val)
} else {
fmt.Println("no")
}
language["js"]["id"] = "3" //修改了js子元素的id值
language["js"]["nickname"] = "测试" //增加js元素里的nickname值
fmt.Println(language)
delete(language, "js") //删除了js子元素
fmt.Println(language)
}
打印
参考
8小时转职Golang工程师(如果你想低成本学习Go语言)_哔哩哔哩_bilibili