iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 10
1
Modern Web

30天就Go:教你打造LINE自動回話機器人系列 第 10

30天就Go(9):Function(後)

Function(後)

callback

callback就是把function A當作變數傳進另一個function B內。而執行B的時候就會callback回去參考A
舉例來說:

package main

import "fmt"

func visit(friends []string, callback func(string)) {
    for _, n := range friends {
        callback(n)
    }
}

func main() {
    visit([]string{"Tina", "James", "Mary"}, func(n string) {
        fmt.Println(n)
    })
}

可以看到在main裡面呼叫了visit,傳入了另一個function,而在執行visit中callback的時候又跑回來參考。

遞迴(recursion)

顧名思義就是function一直呼叫自己,記得要有停止條件,要不然就變無窮迴圈了。

package main

import "fmt"

func double(x int) int {
    x = x * 2
    if x > 64 {
        return x
    }
    return double(x)
}

func main() {
    fmt.Println(double(5))
}

這個範例會回傳x一直乘以二後第一個超過64的值

defer

defer就是在整個function結束後才會執行,滿不錯用的

package main

import "fmt"

func hello() {
    defer fmt.Println("Nice to meet you")
    fmt.Println("Hello Tina")
}

func main() {
    hello()
}

輸出結果會是;

Hello Tina
Nice to meet you

從這邊可以看到,雖然是nice to meet you在hello的第一行,但是加入defer後就會變成hello執行完才執行defer的內容

傳指標(pass-by-pointer)

Go像C語言一樣有指標的概念,同樣可以傳遞

package main 

import "fmt"

func change(x *string) {
    *x = "Tom"
}

func main() {
    name := "Troy"
    fmt.Println(&name) // name的記憶體位置
    
    change(&name) // 傳記憶體位置
    
    fmt.Println(&name) // 記憶體位置不變
    fmt.Println(name) // 但內容有變
}

傳struct

自訂型別struct也是一樣可以傳的,其實也是傳pointer的概念

package main

import "fmt"

type stuff struct {
    name  string
    price int
}

func main() {
    p := stuff{"pancil", 10}
    fmt.Println(p.price)
    inprice(&p)
    fmt.Println(p.price)
}
    
    
func inprice(s *stuff) {
    s.price += 10
}

任性自己執行function

自己宣告完後自己用

package main

import "fmt"

func main() {
    func() {
        fmt.Println("lalala")
    }()
}

記得function宣告完後要加()代表執行的意思


上一篇
30天就Go(8):Function(前)
下一篇
30天就Go(10):Pointer
系列文
30天就Go:教你打造LINE自動回話機器人23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言