对于Go语言中的切片感觉有点像c++中的动态数组
package main
import "fmt"
func main() {
//在go语言中没有所谓的动态数组,所以就有了切片
//切片使用的三中方式
//第一种
var intArray [5]int = [...]int{1, 2, 3, 4, 5}
slice := intArray[2:4]
fmt.Println(slice)
fmt.Println(intArray)
fmt.Println(len(slice))
//第二种
//var Array[]inn(类型)=make([](类型),len,cap)
var Array []int = make([]int, 4, 8)
Array[2] = 33 //没有定义的都为0
fmt.Printf("%v\n", Array[2])
fmt.Println(Array)
//第三种
var strSlice []string = []string{"tom", "alice", "jake"}
fmt.Println(strSlice)
//切片的遍历
for i, v := range strSlice {
fmt.Printf("第%v个元素:%v\n", i, v)
}
strSlice1 := strSlice[1:2]
fmt.Println(strSlice1)
strSlice1[0] = "alex" //主要因为strSlice1是从strSlice中切出来的时,改变strSlice1也会改变strSlice(引用)
fmt.Println(strSlice)
//append可以给切片加上元素
strSlice = append(strSlice, "bier")
fmt.Println(strSlice)
//加上切片,注意加上...
strSlice = append(strSlice, strSlice...)
fmt.Println(strSlice)
//切片的拷贝
var strSlice3 []string = make([]string, 10)
copy(strSlice3, strSlice)
fmt.Println(strSlice3)
//拷贝后,修改原来的值不会对拷贝的结果产生影响
strSlice[3] = "小明"
fmt.Println(strSlice)
fmt.Println(strSlice3)
//string进行切片处理
str := "198abcdefg"
slice0 := str[3:]
fmt.Println(slice0)
//注意字符串是不能修改的,但是可以通过切片方式改变字符串
str1 := []byte(str)
str1[0] = '8'
str = string(str1)
fmt.Println(str)
//有汉字时
str2 := []rune(str)
str2[0] = '好'
str = string(str2)
fmt.Println(str)
}
结果:
[3 4]
[1 2 3 4 5]
2
33
[0 0 33 0]
[tom alice jake]
第0个元素:tom
第1个元素:alice
第2个元素:jake
[alice]
[tom alex jake]
[tom alex jake bier]
[tom alex jake bier tom alex jake bier]
[tom alex jake bier tom alex jake bier ]
[tom alex jake 小明 tom alex jake bier]
[tom alex jake bier tom alex jake bier ]
abcdefg
898abcdefg
好98abcdefg
对于map的使用
首先是定义
package main
import "fmt"
func main() {
//map的使用,注意map声明时没有分配空间,所以要用make进行分配
var a map[string]string
a = make(map[string]string, 10)
a["No.1"] = "A+"
a["No.2"] = "B"
a["No.3"] = "C"
a["No.1"] = "A"
fmt.Println(a)
}
结果:
在这里我是看视频学习的,视频上面是map里面是无序排的,但是我试了许多次,总是得到的是上面的结果。
map的多种声明:
import "fmt"
func main() {
//map的使用,注意map声明时没有分配空间,所以要用make进行分配
var a map[string]string
a = make(map[string]string, 10)
a["No.1"] = "A+"
a["No.2"] = "B"
a["No.3"] = "C"
a["No.1"] = "A"
fmt.Println(a)
//map声明的其他方式
//二
b := make(map[string]string)
b["一"] = "太阳"
b["二"] = "月亮"
b["三"] = "星星"
fmt.Println(b)
//三
c := map[string]string{
"one": "广东",
"two": "北京",
"three": "上海",
}
fmt.Println(c)
}
func main() {
var a map[string]map[string]string = make(map[string]map[string]string)
a["No.1"] = make(map[string]string, 2)
a["No.1"]["姓名"] = "小明"
a["No.1"]["性别"] = "男"
a["No.2"] = make(map[string]string, 2)
a["No.2"]["姓名"] = "杰克"
a["No.2"]["性别"] = "男"
fmt.Println(a)
fmt.Println(a["No.1"])
}
//结果
map[No.1:map[姓名:小明 性别:男] No.2:map[姓名:杰克 性别:男]]
map[姓名:小明 性别:男]
map增加以及删除元素:
func main() {
name := make(map[string]string)
name["1"] = "小明"
name["2"] = "小张" //这里相当于在增加了
name["3"] = "小王"
fmt.Println(name)
//如果key没有的话,就是增加,如果有的话就是修改
name["1"] = "小林"
fmt.Println(name)
//对map进行删除
delete(name, "2")
fmt.Println(name)
//map的查询
val, ok := name["3"]
//如果有的话,ok值为true,没有为false
if ok {
fmt.Printf("存在 %v\n", val)
} else {
fmt.Println("不存在")
}
}
结果:
map[1:小明 2:小张 3:小王]
map[1:小林 2:小张 3:小王]
map[1:小林 3:小王]
存在 小王
map的遍历
func main() {
//map的遍历
name := make(map[string]string)
name["1"] = "小明"
name["2"] = "小张"
name["3"] = "小王"
for k, v := range name {
fmt.Printf("k=%v v=%v\n", k, v)
}
var a map[string]map[string]string = make(map[string]map[string]string)
a["No.1"] = make(map[string]string, 2)
a["No.1"]["姓名"] = "小明"
a["No.1"]["性别"] = "男"
a["No.2"] = make(map[string]string, 2)
a["No.2"]["姓名"] = "杰克"
a["No.2"]["性别"] = "男"
for k1, v1 := range a {
for k2, v2 := range v1 {
fmt.Printf("k1=%v,k2=%v,v2=%v\n", k1, k2, v2)
}
}
//map的长度
fmt.Println(len(name))
fmt.Println(len(a))
}
结果:
k=1 v=小明
k=2 v=小张
k=3 v=小王
k1=No.2,k2=姓名,v2=杰克
k1=No.2,k2=性别,v2=男
k1=No.1,k2=姓名,v2=小明
k1=No.1,k2=性别,v2=男
3
2
//同时本来上面没有证明的无序性,在这里刚好证明了
这是上面的代码的另一个结果:
k=1 v=小明
k=2 v=小张
k=3 v=小王
k1=No.1,k2=姓名,v2=小明//这里顺序与上面不同
k1=No.1,k2=性别,v2=男
k1=No.2,k2=性别,v2=男
k1=No.2,k2=姓名,v2=杰克
3
2
map切片
func main() {
//map切片
var people []map[string]string
//由于定义时,不能浪费太多空间,先定义为2
people = make([]map[string]string, 2)
if people[0] == nil {
people[0] = make(map[string]string, 3)
people[0]["姓名"] = "Alex"
people[0]["年龄"] = "21"
people[0]["性别"] = "男"
}
if people[1] == nil {
people[1] = make(map[string]string, 3)
people[1]["姓名"] = "jack"
people[1]["年龄"] = "23"
people[1]["性别"] = "男"
}
fmt.Println(people)
//为了进行动态增加,可以利用append
//先建立一个新的
newpeople := make(map[string]string, 3)
newpeople["姓名"] = "Alice"
newpeople["年龄"] = "18"
newpeople["性别"] = "女"
people = append(people, newpeople)
fmt.Println(people)
}
结果:
[map[姓名:Alex 年龄:21 性别:男] map[姓名:jack 年龄:23 性别:男]]
[map[姓名:Alex 年龄:21 性别:男] map[姓名:jack 年龄:23 性别:男] map[姓名:Alice 年龄:18 性别:女]]
map里面的排序问题
关于这个问题好像如果是key是string类型的话,好像是无序的,而int则会根据升序的方式进行排序
func main() {
newmap := make(map[int]int)
newmap[8] = 12
newmap[0] = 15
newmap[7] = 16
newmap[12] = 19
newmap[111] = 16
newmap[121] = 19
newmap[44] = 16
newmap[2] = 19
newmap[72] = 16
newmap[82] = 19
fmt.Println(newmap)
}
结果:
map[0:15 2:19 7:16 8:12 12:19 44:16 72:16 82:19 111:16 121:19]