Golang中新的函数赋值语法解析

Golang中新的函数赋值语法解析 鉴于不止一个人误解了我的意思,我声明本文不是一个提问,而是一个建议。实际上,我的文章标题已经说明了一切。误解的人难道不看标题吗?

我想重命名函数:

func sum(x, y int) int { return x + y }
var myfunc = sum
// func myfunc(x, y int) int { return sum(x, y) }

这样可行但不够理想。 如果我们可以将 var 改为 func

func sum(x, y int) int { return x + y }
func myfunc = sum // 或者:func myfunc sum ?

不使用类型推导:

func sum(x, y int) int { return x + y }
func myfunc(x, y int) int = sum // 或者:func myfunc(int,int) int = sum ?
// var myfunc func(int,int) int = sum

右边是一个方法:

type mytype struct{}
func (_ mytype) sum(x, y int) int { return x + y }
var myobject = new(mytype)
func myfunc = myobject.sum
// var myfunc = myobject.sum

如果左边是一个方法,我不知道应该怎么写。

区别在于 var 语法可以多次赋值,而 func 只能赋值一次。


更多关于Golang中新的函数赋值语法解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

我知道这样可行,我只是在创造一种新语法。这种新语法能让godoc识别出这是一个函数。

更多关于Golang中新的函数赋值语法解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的写作风格与我的写作风格适用于不同的使用场景。当使用局部变量简短赋值语法时,文档无法生成,且重命名的函数不能作为公共API使用。

我不理解这个问题。

func sum(x, y int) int { return x + y }
var myfunc = sum

运行正常,你已经给函数起了新名字并且可以调用它:

fmt.Println(myfunc(1,2)) // 正常运行

也许我理解有误。这样重新分配函数名有什么问题?

package main

import (
	"fmt"
)

func func1() {
	fmt.Println("Hello, world!")
}


func func2() {
	fmt.Println("blah, world!")
}
func main() {
	f := func1
	f()
	f = func2
	f()

}

在Go语言中,函数是一等公民,可以像其他值一样被赋值和传递。你提出的语法建议虽然直观,但目前Go标准语法并不支持直接使用func关键字进行函数赋值。以下是对现有语法的解析和示例:

1. 函数赋值的基本用法

使用var声明函数变量是标准做法:

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

// 方法1:类型推导
var myfunc = sum

// 方法2:显式类型声明
var myfunc func(int, int) int = sum

2. 方法赋值

对于方法,赋值方式相同:

type mytype struct{}

func (_ mytype) sum(x, y int) int { return x + y }

var myobject = new(mytype)
var myfunc = myobject.sum

3. 函数类型别名

如果需要更清晰的类型定义,可以使用类型别名:

type BinaryFunc func(int, int) int

func sum(x, y int) int { return x + y }
var myfunc BinaryFunc = sum

4. 函数包装器

如果需要在赋值时添加逻辑,可以显式定义包装函数:

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

func myfunc(x, y int) int {
    // 可以在这里添加额外逻辑
    return sum(x, y)
}

5. 函数赋值的使用示例

package main

import "fmt"

func main() {
    func sum(x, y int) int { return x + y }
    var myfunc = sum
    
    fmt.Println(myfunc(3, 4)) // 输出: 7
    
    // 函数可以作为参数传递
    executeFunc(myfunc, 5, 6) // 输出: 11
}

func executeFunc(f func(int, int) int, a, b int) {
    fmt.Println(f(a, b))
}

当前Go语法设计强调显式和清晰,var声明明确表示了这是在创建变量引用函数,而func关键字专门用于函数定义。虽然你的语法建议在某些场景下可能更简洁,但现有语法已经提供了完整的功能支持。

回到顶部