iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
1

Function(前)

Go的Function方式有幾種

func方法

func foo(name string) {
    fmt.Println("Hi " + name)
}

其中括號內分別為傳入值名稱、型態,剛好跟許多常見的語言顛倒。如果沒有回傳值就空著,也不用填null, nil之類的

fucn方法(多個傳入值)

func foo(name1 string, name2 string) {
    fmt.Println("Hi " + name1 + ", " + name2)
}

如果兩個值型態相同可以這樣

func foo(name1, name2 string) {
    fmt.Println("Hi " + name1 + ", " + name2)

func方法(retuen)

跟很多語言先寫回傳值型態又相反,回傳型態是寫在括號後面的

func foo(name string) string {
    var str = "Hi " + name
    return str
}

func方法(return命名)

Go可以直接在function的回傳區塊命名回傳變數,同樣括號內前者是名稱,後者是型態,return之後還不用填變數

func foo(name string) (str string) {
    str = "Hi " + name
    return
}

func方法(多重return)

可以回傳多個值

func foo(x, y int) (int, int) {
    return x + y, x - y
}

func方法(多傳入值)

如果實在不知道該傳入幾個變數也可以這樣

func total(x ...int) int {
    var t int
    for _, n := range x {
        t += n
    }
    return t
}

關於for的第一個參數為底線是Blank identifier,後面會幫大家介紹

func方法(傳入slice)

slice是類似矩陣的東西,後面幾篇會介紹

func total(x []int) int {
    var t int
    for _, n := range x {
        t += n
    }
    return t
}

當變數宣告

一個類似變數的寫法

foo := func() {
    fmt.Println("Hi " + name)
}

當然這個function的名稱就是foo

function回傳function

上個提到function可以當變數,所以當然也可以用來回傳

func foo() func() string {
    return func() string {
        return "I don't know what is this mean"
    }
}

這個方法我想不到太到有甚麼實質用途,還麻煩高手請教...

下回待續...


上一篇
30天就Go(6):變數的可視範圍
下一篇
30天就Go(9):Function(後)
系列文
30天就Go:教你打造LINE自動回話機器人23

1 則留言

1
shewer
iT邦新手 5 級 ‧ 2019-03-20 21:52:36

關於 return func 我有幾個應用範例
1 例如 return 計算函式
2 建立類似函式內靜態變數

1.

package main
import (
    "fmt"
)

func option( op string ) func(a int,b int) int {
    swich op {
        case "+":
            return func(a int,b int) int {
                return a+b;
            }
            // .......
    }
 }


2.

pack main
func Count_init( num int) int {
    count := num
    return func() int {
        count++
        return count
     }
}
       
func main() {
    count = Count_init(3)
    for j:=10; j>0;j-- {
        fmt.Println("count number:" , count() )
     }
}



我要留言

立即登入留言