您的位置:首页 > 编程语言 > Go语言

Go语言学习笔记(三)数组 & 切片 & map

2017-07-18 10:38 639 查看
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

数组 Arrays

数组是同一种数据类型的固定长度的序列。

数组是值类型,因此改变副本的值,不会改变本身的值;

当作为方法的入参传入时将复制一份数组而不是引用同一指针。

通过从0开始的下标索引访问元素值。

数组定义

var a []int
a = make([]int, 5)
var a1 [5]int = [5]int{1, 2, 3, 4, 5}      //len:5 content:[1 2 3 4 5]
var a2 = [5]int{1, 2, 3, 4, 5}             //len:5 content:[1 2 3 4 5]
var a3 = [...]int{1, 2, 3, 4, 5}           //len:5 content:[1 2 3 4 5]
var a4 = [...]int{1: 100, 2: 200}          //len:3 content:[0 100 200]
var a5 = [...]string{1: "nick", 2: "dawn"} //len:3 content:[ nick dawn]


数组定义后,长度不能变。

长度是数组类型的一部分,具有不同长度的数组,其类型是不同的。

因此,var a[5] int 和 var a[9]int 是不同的类型。

数组使用

通过下标访问,超出会报错

arr := [5]int{1, 2, 3}
//fmt.Println(arr[5])    //报错


通过for遍历数组元素

func main()  {
arr := [5]int{1, 2, 3}
for i:=0; i<len(arr); i++ {
fmt.Println(arr[i])    //12300
}
for i,v := range arr{
fmt.Printf("index[%d]:content[%v]\n", i, v)
}
}


值类型数组赋值,改变副本不会改变自身

func main()  {
arr := [5]int{1, 2, 3}
arr2 := arr
arr2[0] = 10
fmt.Println(arr)    //[1 2 3 0 0]
fmt.Println(arr2)    //[10 2 3 0 0]
}


package main

import (
"fmt"
)

type slice struct {
pre *[100]int
len int
cap int
}

func make1(s slice, cap int) slice {
s.pre = new([100]int)
s.len = 0
s.cap = cap
return s
}

func modify(s slice) {
s.pre[1] = 1000
}

func testSlice() {
var s1 slice
s1 = make1(s1, 10)

s1.pre[0] = 100
modify(s1)

fmt.Println(s1.pre)
}

func main() {
testSlice()
}


模仿切片

map

map在Go语言中是作为一种内建类型存在。

key-value的数据结构,又叫字典或关联数组。

map是引用类型。

map声明是不会分配内存的,需要make初始化。

map声明初始化

声明

var a map[keytype]valuetype
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string  //嵌套


声明并初始化

var a map[string]string
a = make(map[string]string, 10)

a := make(map[string]string, 10)
a := make(map[string]string)

var a map[string]string = map[string]string{}
var a map[string]string = map[string]string{
"A": "A",  //注意是逗号
}


map 使用

增删改查

m["name"] = "Nick"   // "create"
delete(m, "name")    // "delete"
m["name"] = "Dawn"   // "update"
name := m["name"]    // "read"


读取不异常

name, errbool := m["name"]
if !errbool {
m["name"] = "Nick"
}


二维map

func modify(a map[string]map[string]string) {
_, ok := a["name"]
if !ok {
a["name"] = make(map[string]string)
}
a["name"]["Nick"] = "suoning"
a["name"]["Nicky"] = "manyRou"
}

func testMap3() {
var a map[string]map[string]string
a = make(map[string]map[string]string, 10)    //初始化一维
a["name"] = make(map[string]string)           //初始化二维

modify(a)
fmt.Println(a)
}


slice of map

Items := make([]map[int][int], 5)
For i := 0; i < 5; i++ {
items[i] = make(map[int][int])
}


map 排序

先获取所有key,把key进行排序

按照排序好的key,进行遍历

import "sort"

func testMapSort() {
var a map[int]int
a = make(map[int]int, 5)

a[8] = 10
a[5] = 10
a[2] = 10
a[1] = 10
a[9] = 10

var keys []int
for k, _ := range a {
keys = append(keys, k)
}

sort.Ints(keys)

for _, v := range keys {
fmt.Println(v, a[v])
}
}


map 反转

初始化另外一个map,把key、value互换即可

func testMapSort1() {
var a map[string]int
var b map[int]string

a = make(map[string]int, 5)
b = make(map[int]string, 5)

a["name"] = 53
a["ege"] = 10

for k, v := range a {
b[v] = k
}

fmt.Println(b)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: