這節課我們來講解數組,切片和map,或許您是從其他語言轉到GO語言這邊的,那麼在其他語言的影響下您可能會不太適應GO語言的數組,因為GO語言把數組給拆分成了array,slice和map,接下來的時間讓我們一起研究一下這三者的差異以及用法.首先我們說一下array的部份:
    1.數組的長度屬於數組的一部份,我們看下邊的例子
        a:=[1]int{}和b:=[2]int{}
      a和b都是數組,但是他們的長度不同,在GO語言中會認為是不同的兩種類型,既然是不同的類型,那麼他們就不能進行比較或直接賦值的操作.其實這並不難理解,因為GO語言是類型安全的語言,跨越類型的賦值需要顯示的改變數據類型才行.
    2.在GO語言中數組屬於值類型,而非引用類型,如果要取得數組的指針只需要這麼做即可.
        a:=[1]int{};p:=&a
      通過上邊的語句就可以取得數組的指針,並把指針賦值給了變量p
    3.array的鍵名只能用整型或字符型,並且下標從零開始

array的定義格式為:
    var 數組變量名 = [長度]類型{}

接下來讓我們來看這段代碼:
    a1:=[2]int{}                    //聲明一個數組,不賦予初始值,所以數組中每一個元素的值都是int的初值
    a2:=[2]int{1,2}                 //聲明一個數組,并賦予初始值
    a3:=[2]int{1:2}                 //聲明一個數組,給[1]賦初始值
    fmt.Println(a1);
    fmt.Println(a2);
    fmt.Println(a3);
    p1:=&a1                         //取得a1這個數組的指針
    fmt.Println(p1);

b:=[3]string{"aa","bb","cc"}    //聲明一個string類型的數組,并賦予初始值
    c:=[...]string{"aa","bb","cc"}  //聲明一個數組,不設定長度,用三個點告訴GO語言自己計算數組長度
    fmt.Println(b);
    fmt.Println(c);
    fmt.Println(b==c);              //比較兩個數組是否相同

c[1]="BB"                       //修改[1]的值
    fmt.Println(b==c);              //比較兩個數組是否相同
    fmt.Println(cap(c));            //取得數組容量
    fmt.Println(len(c));            //取得數組長度

//array的鍵名必須是數字或字節
    d:=[...]int{96:3,'a':4}         //用字符作為鍵名,因為每個字符實際上是對應了一個int型的序號,所以其實鍵名還是int型的
    fmt.Println(d);

e:=[2][3]int{{1,1,1},{2,2,2}}   //聲明一個二維數組
    fmt.Println(e);

f:=[...][3]int{{1,1,1},{2,2,2}} //聲明一個多維數組,維數讓GO語言來計算
    fmt.Println(f);

p:=new([4]int)                    //這是另外一種聲明數組的方法,可以用new關鍵字,但是這種聲明方法會返回指向數組的指針
    fmt.Println(p);

接下來讓我們來一起看一下slice切片,切片的部份需要大家知道以下幾個要點:
    1.切片本身不是一個數組,但是他的底層指向其他的數組
    2.用切片可以達到變長數組的特性,我們知道array的長度是固定的
    3.切片是引用類型,我們知道array是值類型
    4.切片用make關鍵字建立,array用new
    5.若多個切片指向同一個數組,當這個數組的某個值被改變后,所有的切片的值也跟這邊,這就是引用類型的特性.

建立切片的語法格式如下:
    切片名 = make([]數組名,長度,容量)

讓我們來看一下切片的用法吧:
    //s=make([]int,3,5)            //這是標准的定義方式,定義切片的時候同時分配內存
    //fmt.Println(s);

a:=[...]int{1,2,3,4,5,6,7,8,9,0}
    fmt.Println(a);

s:=[]int{}                    //定義一個切片
    fmt.Println(s);

s=a[5:]                        //讓該切片指向數組a,同時為其賦值
    fmt.Println(s);

x:=a[4:9]
    fmt.Println("x的值是:",x);

a[7]=99                        //改變數組的某個值
    fmt.Println(s);                //打印切片,發現值也變了
    fmt.Println("x的值是:",x);    //此時切片的值也被改變了

s=a[:]                        //取得所有的元素
    fmt.Println(s);

最後我們看一下map的用法,map與數組或切片不同,我們來看一下有哪些不同點
    1.map使用key-value的方式來存儲,key值不再局限於int型,可以是字符串之類的值
    2.map比數組或切片慢很多,所以如果能用數組或切片的情況下儘量別用map
    3.map跟切片一樣是使用make來創建,這一點和數組的new是不同的
    4.map用delete刪除某個元素
    5.用range對map或切片進行迭代操作.

接下來我們看一下map的基本用法:
    var m1 = map[string]float64{"Bell Labs": 40.68433,"Google":37.42202}
    m1["new"]=1.01                    //新增鍵值對
    fmt.Println("三個元素:",m1)

delete(m1,"new")
    fmt.Println("兩個元素:",m1)
    fmt.Println(m1);                //此時鍵["new"]已經不存在了

for k, v := range m1 {            //迭代遍歷map
        fmt.Printf("m1[%s]=%f\n", k, v)
    }
    fmt.Printf("m1的長度是 %d \n", len(m1))

m := make(map[string]int)        //用make建立map
    m["k1"] = 7
    m["k2"] = 13
    fmt.Println("map:", m)

由此可見array;slice;map每個都有各自不同的用法,另外在效能上也有差異,在日常使用時建議使用array和slice,map雖然更靈活只可惜效能不夠高.

希望轉載文章的朋友能夠留一個文章出處,http://blog.csdn.net/sibang 在此感激不盡!

剛成立了一個QQ群,有興趣討論GO語言的朋友可以加入:195112

GO語言基礎教程:數組,切片,map的更多相关文章

  1. GO語言基礎教程:數據類型,變量,常量

    GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左 ...

  2. GO語言基礎教程:序章

    首先自我介紹一下我自己,我是一個coder,目前主要從事B/S程序開發工作,懂點PHP;ASP;JSP;JS;VB;C;DELPHI;JAVA,另外知道幾個數據庫,除此之外別無所長,那麼我為何會選擇學 ...

  3. GO語言基礎教程:流程控制

    在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼: package main import ( "fmt" ) func main(){ var x,y int ...

  4. GO語言基礎教程:Hello world!

    首先簡單地說一下GO語言的環境安裝,從 http://golang.org/dl/ 針對自己的操作系統選擇合適的安裝包,然後下載安裝即可,下載的時候注意別選錯了的操作系統,例如go1.3.1.darw ...

  5. Python 基礎 - bytes數據類型

    三元運算 什麼是三元運算?請看下圖說明 透過上圖說明後,可以得出一個三元運算公式: result = 值1 if 條件 else 值2, 如果鯈件為真: result = 值1 如果鯈件為假: res ...

  6. GO語言視頻教程下載

    需要的朋友可以加QQ群195112,在群共享內可以下載到.

  7. GO語言視頻教程

    第1课:https://github.com/Unknwon/go-fundamental-programming/blob/master/lectures/lecture1.md Go开发环境搭建h ...

  8. Python 基礎 - 文件操作_v2

    嗯,那如何要把游標的位置給打印來? #!/usr/bin/env python3 # -*- coding:utf-8 -*- f = open('test', 'r') print(f.tell() ...

  9. Python 基礎 - 數據類型

    標準數據類型 Python3 中有六個標準的數據類型 1 Number(數字) 2 String(字符串) 3 List (列表) 4 Tuple (元組) 5 Sets (集合) 6 Diction ...

随机推荐

  1. Eclipse CDT、MingGW 遇到的一些错误汇总

    1.写代码时报错 "Member declaration not found" 如图: 在StackOverflow上找到的答案: 出问题的地方是 CDT的新功能 代码检查 Ope ...

  2. mongodb+pycharm使用报错,无法往mongodb存文件

    1 mongodb必须在启用状态下,启用如下 C:/mongodb/bin>mongod --dbpath C:\mongodb\data\db 不能关闭cmd 2 其他问题,貌似在Connec ...

  3. 由struts错误使用引发的漏洞,使用参数作为返回的文件路径或文件名,作为返回result 值

    该错误可以导致他人任意访问该路径下的任何文件. struts 文件 <?xml version="1.0" encoding="UTF-8" ?> ...

  4. windows server 2008 - 创建域和本机用户

    /* * ===================================================================================== * Filenam ...

  5. ios initialize和init等方法

    在程序运行过程中,创建多个类对象,只会调用一次initialize  [ɪˈnɪʃəˌlaɪz] .而创建几个类对象就会调用几次init; 创建一个类aa,分别重写 initialize和init方法 ...

  6. NSA,放开那头魔兽!

    面对NSA的觊觎,玩<魔兽世界>的男生们现在恐怕要护好自己的菊花了.   据新浪科技报道,亡命天涯的斯诺登还在持续爆料,最近的爆料和游戏有关:   NSA和英国政府通信总署(简称“GCHQ ...

  7. php pdo预处理语句与存储过程

    很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 1.查询仅需解析(或预处理) ...

  8. 【动态规划】bzoj1664 [Usaco2006 Open]County Fair Events 参加节日庆祝

    将区间按左端点排序. f(i)=max{f(j)+1}(p[j].x+p[j].y<=p[i].x && j<i) #include<cstdio> #incl ...

  9. linux知识点总结与随笔(关注linux爱好者公众号的一些笔记)

    sysdig工具,可以有strace ,tcpdump,lsof的功能. 前台任务与后台任务,知识点:test.sh &,Ctrl+z,bg,shopt grep |huponexit(sho ...

  10. 第42讲:Scala中泛型类、泛型函数、泛型在Spark中的广泛应用

    今天来了解下scala的泛型 先让我们看下这段代码 class Triple[F,S,T](val first:F,val second: S,val third: T) val triple = n ...