在 Golang 中可以做這樣的事情嗎?package mainimport "fmt"type myFunType func(x int) intvar myFun myFunType = myFunType { return x } // (1) func doSomething(f myFunType) { fmt.Println(f(10))}func main() { doSomething(myFun)}換句話說,是否可以使用函數類型別名來聲明函數類型變量,而不需要重復簽名?或者,有沒有辦法在創建函數類型的變量時不總是重新輸入整個函數簽名?上面的代碼示例(我希望它與下面的代碼示例相同(將 line 替換(1)為 line (2)))會導致編譯錯誤syntax error: unexpected return, expecting expression。package mainimport "fmt"type myFunType func(x int) int var myFun myFunType = func(x int) int { return 2 * x } // (2)func doSomething(f myFunType) { fmt.Println(f(10))}func main() { doSomething(myFun)}
2 回答

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
來自規范:函數文字:
FunctionLit?=?"func"?Signature?FunctionBody?.
函數文字必須包含func
關鍵字和Signature。語法不允許使用函數類型。
函數聲明也是如此:
FunctionDecl?=?"func"?FunctionName?Signature?[?FunctionBody?]?.
不允許使用函數類型(而不是簽名)。
所以不,你想要的東西是不可能的。其原因是因為簽名(函數類型)不包含參數名稱(僅包含它們的順序和類型),但是當您實際“創建”函數值時,您需要一種引用它們的方法,并且只有函數類型,沒有參數名稱。

倚天杖
TA貢獻1828條經驗 獲得超3個贊
不,但在 golang 中你可以定義帶有名稱的方法并使用它們。
舉個例子。有時,在文件的頂部甚至在整個包中,有一種定義錯誤的常見方法,如下所示:
ErrFileNotFound := func(file string) error { return errors.New(fmt.Sprintf("file not found %v", file)) }
然后這個函數可以在文件中多次使用,例如
file, err := os.Open(filenameRequestedToOpen) // For read access.
if err != nil {
log.Fatal(ErrFileNotFound(filenameRequestedToOpen))
}
或參見https://play.golang.org/p/CvBGGc3YeX4
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消