GoLang 基礎文法 (1)

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

Golang 基礎文法 (1)

變數的聲明

在 go 的包中,一個變數或者方法函數或者常量以大寫字母開頭,可以被包外看見使用
既大寫的包變數或者包方法或者包常量是可以匯出的
小寫包變數和包方法還有包常量只能在包內訪問

  • 以下定義方法無論是函數體外還是內都可以

//定義一個變數,名稱為 "numberOfTimes",類型為 "int"var numberOfTimes int//定義三個變數,類型為 “int"var var1, var2, var3 int//定義一個變數,名稱為 "numberOfTimes",類型為 "int",值為 "3"var numberOfTimes int = 3//定義三個類型為 "int" 的變數,並且初始化它們的值var var1, var2, var3 int = 1, 2, 3
  • 變數聲明捷徑(只能在函數或者方法內)

package main//var foo string//foo := "test"func main(){    var bar int    foo1 := 10    //v1 v2 v3可以是任意類型,編譯器會自動確認資料類型    vname1, vname2, vname3 := v1, v2, v3        //下面的 var1 := 11會報錯,因為變數 var1已經被定義,不能重複定義    var var1 int = 10    var1 := 11    //下面正確,只是給 var2重新賦值    var var2 int = 10    var2 = 12}
  • 特殊變數(棄用變數或者匯入包不使用)

go 語言中沒有使用的包或者變數,會導致編譯失敗

//"net/http" 包匯入不使用,如果包裡面有 init 方法,只執行 init 方法import(    "fmt"    _ "net/http")func main(){    //函數 divede 傳回值第一個放棄不使用    _, remainder := divide(10, 3)}
  • 分組定義

//匯入包import(    "fmt"    "os")//常量定義const(    i = 100    pi = 3.1415    prefix = "Go_")//變數var(    i int    pi float32    prefx string)//結構體type(    people struct{        name string        age int    }    animal struct{        name string        leg int    })
  • 關鍵字 iota

const(    x = iota // x == 0    y = iota // y == 1    z = iota // z == 2    w // 省略 iota ,w == 3)const(    a = iota // a == 0    b = 10    c // c == 1    d // d == 2)const v = iota //v ==0const(    e, f, g = iota, iota, iota // e==0, f==0, g==0 因為在同一行)

基礎資料型別 (Elementary Data Type)的特性

  • 布爾類型

    • bool 表示布爾類型

    • bool 的值 只有 true 和 false 且預設值為 false

    • bool 的值不能轉換為數字

  • 數字類型

    • 整形 int

      • 整形分為有符號 int 和無符號 uint,它們具有相同的長度,具體長度取決於作業系統,32位作業系統為32位,64位作業系統為64

      • go語言也定義了 rune,byte,int(8,16,32,64),uint(8,16,32,64)

      • rune 是 int32的別名,byte 是 uint8的別名

      • go 語言不允許不同整型賦值

      var a int8 = 10var b int32 = 10//編譯報錯c := a+b
    • 浮點型

      • 只有 float32 和 float64, 沒有 float

    • 複數 complex

  • 字串 string

    • go 使用 UTF-8 編碼

    • "" 或者 `` 包裹起來的就是字串

    • string 不允許改變值

    • 改變一個字串的方法

    s := "hello"c := []byte(s)c[0] = 'c's2 := string(c)//思考下面的代碼 s1的地址是固定不變的還是會變?//s1 的地址不會改變,string 底層是一個結構體,兩個欄位//其中一個是指向資料的指標//另外一個是資料的長度s1 := "hello"s1 = "sea"s1 = "aa" + s1[1:]
    • 使用 "+" 串連兩個字串

    • `` 多行字串,不會轉義任何字元

    m := `helloworld`

錯誤類型Error types

go 沒有異常處理機制,內建 error 類型,用於處理 errors
go 要求我們要麼顯式處理錯誤要麼忽略

array, slice, map

  • array 定義

var arr [n]typea := [3]int{1, 2, 3}//... 自動識別數組長度a := [...]int{1,3,3}d := [2][2]int{[2]int{0,0}, [2]int{2,2}}d1 := [2][2]int{{1,1}, {22,22}}
  • slice 定義

var fslice []intslice := []byte{'a', 'c', 'd'}
  • slice 操作

a := []int{1,2,3,5}b := a[1:] // b 為 2,3,5 但是 a  b 共用底層資料結構,修改 a 或者 b , a和 b 都會改變b := a[:2] // b 為 1, 2
  • 內建函數

    • len 擷取 slice 長度

    • cap 擷取 slice 最大容量

    • append 追加一個或者多個元素到 slice, 返回 slice

    • copy 複製一個 slice 到另外一個,返回 copy的元素個數

  • map - 類似於 Ptyon 裡面的字典 key-value

    • map 不是有序的,每次列印輸出結果順序不一樣,使用 key 去擷取 value

    • map 沒有固定長度,和 slice 一樣是參考型別

    • len 函數可以用在 map上,返回 map 現在包含多少個 key

    • map 可以很容易根據 key 修改 value

    • delete 可以刪除 map 中指定key 的元素

slice 的索引只能是 int,map 的索引可以是任何你想要的類型

numbers := make(map[string]int)numbers["one"] = 1

make new 區別

  • make 給內建類型分配記憶體,並且初始化它們,返回非零值

    • map

    • slice

    • channel

  • new(T) 返回零值

控制結構和函數

  • if 不需要括弧

if test {}//分號隔開,賦值if x := len(slice); x >0 {}
  • goto

func my(){    i := 0Here:   //label goto    i++    goto Here //跳轉到 Here}
  • for 可替代 while,do-while

    • break continue

  • switch

    • case 的值可以有多個 逗號隔開

    • 只執行匹配的 case 不需要 break

    • default 如果沒有匹配的執行

  • func 定義函數

    • 函數有0-多個參數,參數名稱在參數類型前

    • 函數可以返回多個值或者不傳回值

    • 多變參數 ...

    • go 函數參數本質都是傳值

    • 函數可以被當做值和參數類型

func funcName(p1 type1, p2 type2)(returnType1, returnType2{    return a, b}func varFunc(arg1 ...int){}
  • defer 順延強制,先進後出 FILO

  • panic & recover

  • main & init 函數

    • main 包的 main 函數,是程式入口

    • 每個包可以有多個 init 函數,在 impprt 的時候執行,用於做一些初始化操作,包裡面每個檔案就只能一個 init 函數了

  • import 匯入包

    • . 操作符,調用的還是可以忽略掉包名

    • 別名

    • _ 只匯入不使用

import(    . ”fmt" //忽略包名    o "os"  //別名    _ "net/http"    //匯入包執行 init 方法不使用)

未完待續

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.