zoukankan      html  css  js  c++  java
  • Go语言_array,slice,map

    首先庆祝下golang终于通过了gfw的审核,可以不用FQ访问了。goer就可以光明正大地访问http://golang.org/

    这次还是要说说array,slice,map。虽然前面已经说过了,但是实际使用中发现对这几个的使用和理解还是不够详细

    现在再重新看看这几个类型

    array类型

    array是固定长度的数组,这个和C语言中的数组是一样的,使用前必须确定数组长度。但是和C中的数组相比,又是有一些不同的:

    1 Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份

    2 如果Go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针。这个和C要区分开。因此,在Go中如果将数组作为函数的参数传递的话,那效率就肯定没有传递指针高了。这个是不是有点陷阱的感觉?

    3 array的长度也是Type的一部分,这样就说明[10]int和[20]int是不一样的。

    array的结构用图示表示是这样的:

    clip_image001

    len表示数组的长度,后面的int储存的是实际数据

    slice类型

    看看Effective Go是怎么夸赞slice的:

    clip_image002

    Slice是Go程序中最常用的表示序列数组的类型。为什么最经常用它呢?

    1 slice是可变长的

    定义完一个slice变量之后,不需要为它的容量而担心,你随时可以往slice里面加数据

    比如:

    v:=[]string{}

    v=append(v, "hello")

    这里附带说一下,slice和array的写法很容易混

    v:=[2]string{"str1", "str2"} //这个是array

    m:=[]string{"str1","str2"} //这个是slice

    写法上默念:array有长度slice没长度,array有长度slice没长度…

    2 slice是一个指针而不是值。

    指针比值可就小多了,因此,我们将slice作为函数参数传递比将array作为函数参数传递会更有性能。

    slice是一个指针,它指向的是一个array机构,它有两个基本函数len和cap。

    看下面的图示:

    clip_image003

    slice是一个带有point(指向数组的指针),Len(数组中实际有值的个数),Cap(数组的容量)

    比如上面的这个slice,它指向的数组是[3]int,其中的前两个有值,第三个为空

    那么

    len(slic) = 2

    cap(slic) = 3

    append函数就理解为往slice中加入一个值,如果未达到容量(len<cap)那么就直接往数组中加值,如果达到容量(len = cap)那么就增加一个新的元素空间,将值放在里面

    map结构

    map结构也经常常用,它和php中的array()几乎一模一样,是一个key-value的hash结构。key可以是除了func类型,array,slice,map类型之外的类型。

    它的使用也是非常简单

    m:=map[string]string{}

    m["key1"] = "val1"

    map结构和slice是一样的,是一个指针。赋值的时候是将指针复制给新的变量

    map的增删改查操作是这样的:

    package main
    
    import(
        "fmt"
    )
    
    func main() {
        m := map[string]string{"key1":"val1"}
        fmt.Println(m)
        m["key2"] = "val2"
        fmt.Println(m)
        p := m["key1"]
        fmt.Println(p)
        delete(m, "key1")
        fmt.Println(m)
    
    }

    clip_image004

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/yjf512/p/2549929.html
Copyright © 2011-2022 走看看