初學 Golang 30 天 - (12)Channel

Chennel

上一張我們談到 Goroutine ,我們不能不談談 Channel ,這也是 Go 非常特別的特色。
要建立一個 Channel 很簡單,*make(chan string) * 這樣就可以了。
我們來看看下面這個範例

package main

import "fmt"

func main() {

    messages := make(chan string)

    go func() { messages <- "ping" }()

    msg := <-messages
    fmt.Println(msg)
}

這邊簡單建立了一個 message 的 channel ,可以傳輸字串,然後用 go 來 call goroutine 執行函式,然後 msg 負責接收 messages 的傳輸資料,goroutine 執行的函式裡面傳 "ping" 到 messages 這個 channel 裡面,再由 message 傳給 msg 變數印出。
很簡單直覺對吧!透過這個方法就可以簡單的讓 Goroutine 可以溝通!

初學 Golang 30 天 - (11)Goroutine

雖然有點早,但是我們來講一下 Go 很酷的特色 Goroutine ,他類似於其他語言的 Thread。

Goroutines

要使用 Goroutine 非常的簡單,只要一個字,一個很熟悉的字,「go」。
讓我們看看下面這個簡單的例子,

package main

import "fmt"

func f(n int) {
    for i := 0; i < 10; i++ {
        fmt.Println(n, ":", i)
    }
}

func main() {
    go f(0)
}

你執行後你會發現什麼東西都沒有印出!
不是 Go 有問題,因為使用 goroutine 是平行處理的,所以在還沒開始印 n 之前,main 這個主要的函式已經結束了。
我們使用一下內建的 time 函式,讓 main 韓式等一下,讓 goroutine 跑完。

package main

import (
    "fmt"
    "time"
)

func f(n int) {
    for i := 0; i < 10; i++ {
        fmt.Println(n, ":", i)
    }
}

func main() {
    go f(0)
    time.Sleep(time.Second * 1) // 暫停一秒鐘

}

你就可以看到印出 1 ~ 10 了。

初學 Golang 30 天 - (10)函式

1. 函式

範例程式碼

package main

import "fmt"

func add(x int, y int) int {
    return x + y
}

func main() {
    fmt.Println(add(42, 13))
}

函數可以沒有參數或接受多個參數。
在這個例子中," add " 接受兩個 int 類型的參數。
注意類型在變數之後。
return 代表傳回的數值為何,這裡表示傳回 x + y 也就是 42+13 ,所以結果會是 55。
詳細的語法定義可以參考官方文件。
當兩個或多個連續的函數命名參數是同一類型,則除了最後一個類型之外,其他都可以省略。
舉例來說

x int, y int

可以被縮寫為

x, y int

也就是說上面的範例程式碼可以改成

package main

import "fmt"

func add(x, y int) int {
    return x + y
}

func main() {
    fmt.Println(add(42, 13))
}

兩種方法的輸出結果都會是相同的。

輸出結果

55

2. 多數值的返回

函數可以返回任意數量的返回值。
這個函數返回了兩個字串。

範例程式碼

package main

import "fmt"

func swap(x, y string) (string, string) {
    return y, x
}

func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}

輸出結果

world hello

3. 命名返回值

在 Go 中,函數可以返回多個「結果參數」,而不僅僅是一個值。它們可以像變數那樣命名和使用。
如果命名了返回值參數,一個沒有參數的 return 語句,會將當前的值作為返回值返回。
以這個程式碼為例,sum int 表示宣告整數 sum ,將參數 17 放入 sum 中,x, y int 宣告整數 x,y 在下面使用,由於 return 沒有設定返回值,這邊程式就將 x,y 都回傳了,所以結果會出現 7 10。

範例程式碼

package main

import "fmt"

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

func main() {
    fmt.Println(split(17))
}

輸出結果

7 10