第三章、Go-内建容器
3.1.数组
(1)数组的定义
package main
import (
"fmt"
)
func main() {
//用var定义数组可以不用赋初值
var arr1 [5]int //[0 0 0 0 0]
//用冒号必须指定初值
arr2 := [3]int{1,3,5} //[1 3 5]
//用“...”表示任意个数
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr1,arr2,arr3)
}
(2)数组的遍历
用range关键字
package main
import (
"fmt"
)
func main() {
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr3)
//数组的遍历
for i := range arr3{
fmt.Println(arr3[i])
}
}
//结果
2
4
6
8
10
获取下标和值
package main
import (
"fmt"
)
func main() {
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr3)
//数组的遍历
for i ,v:= range arr3{
fmt.Println(i,v)
}
}
//结果
0 2
1 4
2 6
3 8
4 10
(3)数组是值类型
- [10]int和[20]int是不同类型
- 调用func f(arr [10]int) 会拷贝数组
- 在go语言中一般不使用数组,而使用切片
package main
import (
"fmt"
)
func printArray(arr [5]int){
for i ,v:= range arr{
fmt.Println(i,v)
}
}
func main() {
//arr2 := [3]int{1,3,5}
arr3 := [...]int{2,4,6,8,10}
printArray(arr3)
}
//结果
0 2
1 4
2 6
3 8
4 10
如果传arr2则报错
package main
import (
"fmt"
)
func printArray(arr [5]int){
for i ,v:= range arr{
fmt.Println(i,v)
}
}
func main() {
arr2 := [3]int{1,3,5}
//arr3 := [...]int{2,4,6,8,10}
printArray(arr2) //cannot use arr2 (type [3]int) as type [5]int in argument to printArray
}
3.2.切片
(1)切片
package main
import "fmt"
func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println(arr[2:6]) //[2 3 4 5]
fmt.Println(arr[:6]) //[0 1 2 3 4 5]
fmt.Println(arr[2:]) //[2 3 4 5 6 7]
fmt.Println(arr[:]) //[0 1 2 3 4 5 6 7]
}
(2)slice的扩展
slice可以向后扩展,不可以向前扩展
package main
import "fmt"
func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println(s1) //[2 3 4 5]
fmt.Println(s2) //[5 6]
}
s2是如何取到[5,6]的

(3)slice的实现
slice底层隐藏了三个值

s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
package main
import "fmt"
func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println("arr = ",arr) //arr = [0 1 2 3 4 5 6 7]
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
fmt.Println(s1[3:6]) //[5 6 7]
}
3.3.切片的操作
(1)向slice添加元素
- 添加元素时,如果超出了cap,系统会重新分配更大的底层数组
- 由于值传递的关系,必须接收append的返回值。s = append(s,val)
package main
import "fmt"
func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6] //[2 3 4 5]
s2 := s1[3:5] //[5 6]
s3 := append(s2,10)
s4 := append(s3,11)
s5 := append(s4,12)
fmt.Println(s3,s4,s5) //[5 6 10] [5 6 10 11] [5 6 10 11 12]
//因为s2的cap是[5,6,7],s3 append把7替换成10,s4后超出了cap
fmt.Println(arr) //[0 1 2 3 4 5 6 10]
}
(2)slice的创建
package main
import "fmt"
func main() {
//第一种
//Zero value for slice is nil
var s1 []int
fmt.Println(s1) //[]
for i := 0; i < 5 ; i++{
s1 = append(s1,i)
}
fmt.Println(s1) //[0 1 2 3 4]
//第二种
s2 := []int{2,4,6,8}
fmt.Printf("len(s2)=%d,cap(s2)=%d\n",len(s2),cap(s2)) //len(s2)=4,cap(s2)=4
//第三种
s3 := make([]int,16)
fmt.Printf("len(s3)=%d,cap(s3)=%d\n",len(s3),cap(s3)) //len(s3)=16,cap(s3)=16
//第四种
s4 := make([]int,16,32)
fmt.Printf("len(s4)=%d,cap(s4)=%d\n",len(s4),cap(s4)) //len(s4)=16,cap(s4)=32
}
(3)slice的删除
package main
import "fmt"
func main() {
s1 := []int{0,1,2,3,4,5,6}
fmt.Println(s1) //[0 1 2 3 4 5 6]
//删除index为3的值
s1 = append(s1[:3],s1[4:]...)
fmt.Println(s1) //[0 1 2 4 5 6]
}
3.4.Map
(1)map的三种建立方式
package main
import "fmt"
func main() {
//第一种
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek]
//第二种
m2 := make(map[string]int)
fmt.Println(m2) //map[]
//第三种
var m3 map[string]string
fmt.Println(m3) //map[]
}
(2)map的遍历
package main
import "fmt"
func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek]
for k,v := range m1{
fmt.Println(k,v)
}
}
//结果
name derek
course go
city guangdong
(3)值的获取
key存在获取,不存在则得到空值
package main
import "fmt"
func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek]
//获取map中key的value
courseName := m1["course"]
fmt.Println(courseName) //go
//如果key不存在,不会报错,而是得到一个空值
age := m1["age"]
fmt.Println(age) //空值
}
(4)用if判断取值
package main
import "fmt"
func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek]
//key存在,ok = true
courseName,ok := m1["course"]
fmt.Println(courseName, ok) //go true
//key不存在,ok = false
age, ok := m1["age"] // ok = false
fmt.Println(age,ok)
//取值的时候加一个判断,ok=true取值,否则打印值不存在
if age, ok := m1["age"]; ok{
fmt.Println(age)
}else {
fmt.Println("key does not exist")
}
}
(5)删除key
package main
import "fmt"
func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek]
//删除key
delete(m1,"city")
fmt.Println(m1) //map[course:go name:derek]
}
posted on 2019-08-02 00:02 zhang_derek 阅读(272) 评论(0) 收藏 举报
浙公网安备 33010602011771号