亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go - var 和 func 定義函數的區別

Go - var 和 func 定義函數的區別

Go
慕神8447489 2022-12-13 10:29:47
我來自 Scala 背景,在 Scala 中,您可以將函數定義為單個值或實際函數,例如:val inc1: Int => Int = _ + 1 // single FUNCTION valuedef inc2(x: Int): Int = x + 1 // normal function definition// in this case "inc1 eq inc1" is true, since this is a single instance// but "inc2 eq inc2" is false這兩個有一些差異(即大小分配,第一個是單個實例,而另一個在每次調用時返回一個實例,...),因此根據用例,我們可以推斷出哪個一個使用。現在我是 golang 的新手,想知道以下 2 個函數定義(如果我用詞有誤請糾正我)在 Golang 中是否不同,如果有,有什么區別?var inc1 = func(x int) int { return x + 1 }func inc2(x int) int { return x + 1 }提前致謝!
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

Scala 大量借鑒了函數式編程。去沒有。

(如果你使用過多種其他編程語言,你絕對應該閱讀Go 規范。它不是很長,因為 Go 不是一種非常大的語言,盡管新的泛型肯定會使事情復雜化一些。)

在 Go 中,func關鍵字引入函數定義或函數類型,具體細節取決于上下文。關鍵字var引入變量聲明。1 所以:

func inc2(x int) int { return x + 1 }

定義了一個函數,inc2,其代碼如圖所示。但:

var inc1 = // ...

聲明然后初始化一個變量,inc1變量的類型和初始由注釋掉的部分決定,所以:

var inc1 = func(x int) int { return x + 1 }

定義了一個函數(沒有名字),其代碼如下所示。然后將該函數分配給變量作為其初始值,因此變量的隱含類型func (int) intor function 接受一個 type 的參數int并返回一個 type 的值int

創建變量后,您現在可以調用當前存儲在該變量中的函數:

func callit(arg int) {

    result := inc1(arg)

    // ... do something with the result ...

}

或者您可以為變量分配一個新值,例如:


func overwrite() {

    inc1 = func(a int) int { return a * 2 } // name `inc1` is now misleading

}

因為inc2是一個函數,你不能重新給它賦新值:它只是一個函數,不是變量。


1請注意,帶有初始化的變量聲明可以使用“短聲明”形式:


func f() {

    v := 3

    // ...

 }

我們省略了類型,只說“使用表達式的類型來確定聲明的類型”。這聲明并初始化變量。短聲明只能出現在塊范圍內,因此它們必須在某個函數內。除了省略關鍵字外,它們不會做任何你通過包含關鍵字或有時包含多個關鍵字var無法做到的事情:varvar


    result, err := doit()

可能需要:


    var result someType

    var err error

    result, err = doit()

在不使用簡短聲明形式編寫時。


查看完整回答
反對 回復 2022-12-13
  • 1 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號