golang入門學習筆記(一)

weixin_34185560發表於2017-11-21

作者: 一字馬胡
轉載標誌 【2017-11-21】

更新日誌

日期 更新內容 備註
2017-11-21 新建文章 go語言入門筆記(一)

準備環境

在Mac下,可以使用下面的命令安裝golang:


brew install go

完成安裝之後,可以命令“go version”來檢視安裝的go的版本資訊。安裝go完成之後,就可以開始學習go語言了,為了提高開發效率,建議使用IDE進行開發,但是如果不喜歡IDE也可以不使用,我推薦使用IDEA + plug 的方式來準備開發環境,可以在plug裡面搜尋go,然後就可以點選安裝外掛,完成之後就可以進行go開發了。

hello world !

學習一門新語言,首先要寫出“hello world”,下面的程式碼展示瞭如何使用golang來做這件簡單的事情:


import "fmt"

func main() {
    helloWorld := "hello Word from golang!"
    fmt.Print(helloWorld)
}

var for golang

var在go語言中用於定義一個或者多個變數,下面是一些例子:


    var hello string = "hello"
    var id1, id2 int = 1, 2
    
    fmt.Print(hello, id1, id2)

一般可以使用“:=”來定義一個變數並且進行初始化,比如下面的例子:


    ok := "this is a word"
    number := 1024

    fmt.Printf("%s, %d", ok, number)

const for golang

在go中使用const來進行常量的宣告,關於go中的常量可以參考:


A const statement can appear anywhere a var statement can.
Constant expressions perform arithmetic with arbitrary precision.
A numeric constant has no type until it’s given one, such as 
by an explicit cast.A number can be given a type by using it in 
a context that requires one, such as a variable assignment or
 function call. For example, here math.Sin expects a float64.

下面是go中使用常量的例子:


    const Kb  = 1024
    const Mb  = Kb * 1024
    const Gb  = Mb * 1024

    fmt.Printf("Kb:%d Mb:%d Gb:%d\n", Kb, Mb, Gb)

loop for golang

在go語言中,沒有像其他語言中一樣同時存在for、while等迴圈語法支援,go只支援for語句,下面是使用for迴圈的示例:


    for i:= 0;i < 10; i ++ {
        fmt.Printf("%d\t" , i)
    }
    fmt.Print("\nEnd of for loop.\n")
    
    for {
        fmt.Print("loop...")
    }

如果想要實現無限迴圈,可以使用for {}。

if-Else for golang

值得注意的是,在go語言中進行for迴圈或者if-else語句編寫的時候,要和其他語言(比如Java)區分一下,go語言不能在條件上帶上(),這一點和其他語言是有所區別的,需要特別注意。下面展示了使用go中的if-else語句的示例:


    size := 1024 * 0.8
    if size > Kb {
        fmt.Printf("%f > %d\n", size, Kb)
    } else {
        fmt.Printf("%f <= %d\n", size, Kb)
    }

    if size := 1024 * 1.1; size > Kb {
        if size > Mb {
            fmt.Printf("%f > %d\n", size, Mb)
        } else {
            fmt.Printf("%d <= %f <= %d", Kb, size, Mb)
        }
    }

可以在go的判斷語句中進行變數賦值,這樣寫程式碼感覺行雲流水,非常流暢,值得推薦。

switch for golang

go語言的switch看起來更加強大,下面是switch的使用示例:


    i := 2
    switch i {
    case 1:
        fmt.Println("one")
    case 2:
        fmt.Println("two")
    case 3:
        fmt.Println("three")
    }
    
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("It's before noon")
    default:
        fmt.Println("It's after noon")
    }

    whatAmI := func(i interface{}) {
        switch t := i.(type) {
        case bool:
            fmt.Println("I'm a bool")
        case int:
            fmt.Println("I'm an int")
        default:
            fmt.Printf("Don't know type %T\n", t)
        }
    }
    whatAmI(true)
    whatAmI(1)
    whatAmI("hey")    

執行上面的程式碼,輸出如下:


two
It's after noon
I'm a bool
I'm an int
Don't know type string

array for golang

下面的程式碼展示了go語言中陣列的使用示例:


    var array1 [10]int
    for i := 0; i < 10 ; i ++ {
        array1[i] = i * 10
    }

    array2 := [2]float64 {0.01, 0.02}
    array2[0] += 1.0
    array2[1] -= 0.002

    var array3 [3][4]int
    for i := 0; i < 3; i ++ {
        for j := 0; j < 4; j ++ {
            array3[i][j] = i * j
        }
    }

Slices for golang

和陣列類似,但是和陣列不一樣,go支援Slices,下面是Slices的使用示例:

建立一個空的Slices並且賦值:


    s := make([]int, 2)
    s[0] = 1
    s[1] = 2

append操作:


    s := make([]int, 2)
    s[0] = 1
    s[1] = 2

    s = append(s, 3, 4, 5)

    for i := 0; i < len(s); i ++ {
        fmt.Printf("%d \t", s[i])
    }
    fmt.Print("\nEnd of prinf\n")

拷貝Slices操作:


    cs := make([]int, len(s))
    copy(cs, s)
    for i := 0; i < len(cs); i ++ {
        fmt.Printf("%d \t", cs[i])
    }
    fmt.Print("\nEnd of prinf\n")

slice操作:


    ss := make([]string, 0)
    ss = append(ss, "a", "b", "c", "d", "e", "f")

    ss1 := ss[1:2]
    ss2 := ss[:4]
    ss3 := ss[3:]

    fmt.Printf("%s ,%s , %s , %s\n", ss, ss1, ss2, ss3)
    
    output:
    
    [a b c d e f] ,[b] , [a b c d] , [d e f]

map for golang

map是一種特別重要的資料結構,平時使用也是比較頻繁的,下面的程式碼展示了go語言中的map的使用方法:


    m := make(map[string]int)
    m["ok"] = 200
    m["error"] = 404

    //delete item from map
    delete(m, "ok")

    is, v:= m["error"]

    fmt.Print(v, is, "\n")

    mp := map[string]int {"a":10, "b": 20}
    fmt.Print(mp, "\n")

Range for golang

下面是使用Range的例子:


    num :=  make([]int, 0)
    num = append(num, 1, 2, 3, 4, 5)
    sum := 0
    for _, s := range num {
        sum += s
    }

    for k, v := range m {
        fmt.Printf("%s, %s\n" , k, v)
    }

    for i, v := range "golang" {
        fmt.Printf("%d->%c\n", i, v)
    }


range像是一個迭代器(和其他語言的迭代器非常類似)。

function for golang

下面的程式碼展示了go語言中方法的使用示例:


func total(a, b int) int  {
    return a + b
}

fmt.Print("sum:", total(1, 3), "\n")

在go語言的方法設計中,允許有多個返回值,下面是示例:


func multiReturn() (int, string, float32)  {
    return 1, "ok", 0.1
}

    a, b, c := multiReturn()

    fmt.Print("multiReturn:", a, b, c, "\n")

可變引數:


func multiParams(args ...int) int {
    sum := 0
    for _, v := range args {
        sum += v
    }
    
    return sum
}


    is = multiParams(1, 2, 3, 4, 5)
    fmt.Printf("sum: %d\n" , is)

匿名函式:


func getIntValue() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

    nextInt := getIntValue()

    fmt.Printf("%d, %d, %d\n", nextInt(), nextInt(), nextInt())

pointer for golang

在go語言中,你可以使用指標進行一些操作了,是不是用慣了java就會不習慣呢?下面是示例程式碼:


    var point *int
    num := 10
    point = &num
    fmt.Print("point:", point, " value:", *point)

struct for golang

可以使用指標,又有struct,是不是和c語言越來越像了呢?下面是使用struct的示例:


    type info struct {
        id int
        name struct{
            firstName string
            lastName string
             }
    }

    var p *info
    p = new(info)
    p.id = 12
    p.name.firstName = "jian"
    p.name.lastName = "hu"

    infoo := new(info)
    infoo.id = 13
    infoo.name.firstName = "haha"
    infoo.name.lastName = "lulu"

    fmt.Print(infoo, "\n")

7853175-a505956ef7113ba2.png

相關文章