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/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    JavaScript之函数(上)
    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)<转>
    Mac配置环境变量注意点
    netty tcp拆包
    mybatis注解方式批量插入数据
    JMX超详细解读<转>
    使用EmbeddedValueResolverAware读取配置文件内容
    线程的几种状态转换<转>
    Java线程池关闭1-shutdown和isTerminated<转>
    Maven项目编译后classes文件中没有.xml问题
  • 原文地址:https://www.cnblogs.com/yjf512/p/2549929.html
Copyright © 2011-2022 走看看