设为首页 加入收藏

TOP

Go语言学习笔记(三)数组 & 切片 & map(二)
2017-09-30 13:26:47 】 浏览:9600
Tags:语言学习 笔记 数组 切片 map
ntent:%v\n
", len(slice), slice) //len[6],content:[1 2 5 6 8 9] fmt.Printf("len[%d],content:%v\n", len(slicecp), slicecp) //len[6],content:[10 2 5 6 8 9] sliceN := append(slice, slicecp...) fmt.Printf("len[%d],content:%v\n", len(sliceN), sliceN) //len[12],content:[1 2 5 6 8 9 10 2 5 6 8 9]

值类型修改值会影响本身。

slice0 := []string{"a", "b", "c", "d", "e"}
slice1 := slice0
slice1[0] = "Nick"
fmt.Println(slice0)    //[Nick b c d e]
fmt.Println(slice1)    //[Nick b c d e]

 

内存布局与扩容

切片是引用类型,指针内部只向一个数组。

 代码实现,内存地址表示是同一块地址。

func main() {
    var a []int = []int{1, 2, 3, 4, 5}
    s := a[1:]
    fmt.Printf("a=%p, s=%p \n", &(a[1]), s) //a=0xc420016188, s=0xc420016188
    s = append(s, 10, 10, 10)
    fmt.Printf("a=%p, s=%p \n", &a[1], s)   //a=0xc420016188, s=0xc4200141c0
}

切片的长度是可变的,那自动扩容是怎样的机制呢?

是 double(双倍),看下面代码。

func main() {
    var a [5]int = [...]int{1, 2, 3, 4, 5}
    s := a[1:]
    fmt.Println(cap(s), len(s)) //4 4
    s = append(s, 10, 10, 10)
    fmt.Println(cap(s), len(s)) //8 7
    s = append(s, 10)
    fmt.Println(cap(s), len(s)) //8 8
    s = append(s, 10)
    fmt.Println(cap(s), len(s)) //16 9
    s = append(s, 10, 10, 10, 10)
    fmt.Println(cap(s), len(s)) //16 13
    s = append(s, 10, 10, 10, 10, 10, 10)
    fmt.Println(cap(s), len(s)) //32 19
}
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 排序

  1. 先获取所有key,把key进行排序
  2.  按照排序好的key,进行遍历
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go语言学习笔记(二)十分钟上手 下一篇Go语言string,int,int64 ,float..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目