Go语言切片slice和map

一.切片(slice)

对于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

对于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)
}

结果:
Go语言切片slice和map_第1张图片
map里面再设计map

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]

你可能感兴趣的:(golang,java,开发语言)