go語言基礎

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

運行:go run xxx.go

編譯:go build xxx.go 產生可執行檔

程式開始:package main

引入包:import “fmt” 或者 import (

     “fmt"

     “os"     

)

注意:Println不支援,Printf才支援%式的輸出

 

變數和常量:

     在函數外聲明變數用:var a 或者 var (

          a int

          b str = “hi"

     )

     在函數裡用: := 聲明,如 t := 10

註:在go裡,聲明變數可以不宣告類型,可以通過值來自動推斷

 

     常量定義 : 用const關鍵字 const s string = “hi” 或者 const(

          s string = “hi"

          pi float32 = 3.1415926

     )

 

數組:

     var a [5]int 定義長度為5的值為int類型的數組

     var b [3]int{1, 2, 3}定義長度為3,值為int類型的1,2,3 結果為 =》[1, 2, 3]

     用len()方法返回數組的長度

     數組切片操作:

          var a [5]int

          或者 a := [5]int{0,1,2,3,4}

          a[2:4]從2到4,不包括4

          a[:4]從0到4,不包括4

          a[2:]從2到最後包括2

 

條件陳述式:

    if len(a) == 5 {        ….    } else {        ….    }    switch a {         case a[0] >0 :              ….         case a[2] == 2 :              ….         default:              ….    }

     注意go語言中switch語句沒有break,因為go裡的casa不會下穿

 

迴圈語句:

    for i := 0; i < 5; i++ {}    range關鍵字迴圈數組,map等    i := [3]int{2, 3, 4}    for a, v := range i {         fmt.Println(a)         fmt.Println(v)    }    死迴圈:    for {}

     

map

package mainimport"fmt"      func main(){    m := make(map[string]int) //使用make建立一個空的map                        m["one"] = 1    m["two"] = 2    m["three"] = 3                        fmt.Println(m) //輸出 map[three:3 two:2 one:1] (順序在運行時可能不一樣)    fmt.Println(len(m)) //輸出 3                        v := m["two"] //從map裡取值    fmt.Println(v) // 輸出 2                        delete(m, "two")    fmt.Println(m) //輸出 map[three:3 one:1]                        m1 := map[string]int{"one": 1, "two": 2, "three": 3}    fmt.Println(m1) //輸出 map[two:2 three:3 one:1] (順序在運行時可能不一樣)                        for key, val := range m1{        fmt.Printf("%s => %d \n", key, val)        /*輸出:(順序在運行時可能不一樣)            three => 3            one => 1            two => 2*/    }}

                           

指標

var i int= 1var pInt *int= &i//輸出:i=1     pInt=0xf8400371b0       *pInt=1fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)                    *pInt = 2//輸出:i=2     pInt=0xf8400371b0       *pInt=2fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)                    i = 3//輸出:i=3     pInt=0xf8400371b0       *pInt=3fmt.Printf("i=%d\tpInt=%p\t*pInt=%d\n", i, pInt, *pInt)

 

Go具有兩個分配記憶體的機制,分別是內建的函數new和make。他們所做的事不同,所應用到的類型也不同,這可能引起混淆,但規則卻很簡單。

 

記憶體配置

new 是一個分配記憶體的內建函數,但不同於其他語言中同名的new所作的工作,它只是將記憶體清零,而不是初始化記憶體。new(T)為一個類型為T的新項目分配了值為零的儲存空間並返回其地址,也就是一個類型為*T的值。用Go的術語來說,就是它返回了一個指向新分配的類型為T的零值的指標。

make(T, args)函數的目的與new(T)不同。它僅用於建立切片、map和chan(訊息管道),並傳回型別T(不是*T)的一個被初始化了的(不是零)執行個體。這種差別的出現是由於這三種類型實質上是對在使用前必須進行初始化的資料結構的引用。例如,切片是一個具有三項內容的描述符,包括指向資料(在一個數組內部)的指標、長度以及容量,在這三項內容被初始化之前,切片值為nil。對於切片、映射和通道,make初始化了其內部的資料結構並準備了將要使用的值。如:

下面的代碼分配了一個整型數組,長度為10,容量為100,並返回前10個數組的切片

make([]int, 10, 100)

以下樣本說明了newmake的不同。

varp *[]int = new([]int)   // 為切片結構分配記憶體;*p == nil;很少使用varv  []int = make([]int, 10) // 切片v現在是對一個新的有10個整數的數組的引用// 不必要地使問題複雜化:var p *[]int = new([]int)fmt.Println(p) //輸出:&[]*p = make([]int, 10, 10)fmt.Println(p) //輸出:&[0 0 0 0 0 0 0 0 0 0]fmt.Println((*p)[2]) //輸出: 0                    // 習慣用法:v := make([]int, 10)fmt.Println(v) //輸出:[0 0 0 0 0 0 0 0 0 0]

 

以上內容是平凡公子本人的一些學習筆記和總結,感謝學習時所看到的各篇文章的作者!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.