go - 可重新配置的函数变量

标签 go

出于测试原因,我有兴趣在 Go 中重新分配工厂函数,以降低在想要模拟其中一种类型时在给定包中使用工厂函数的风险。

我见过人们将工厂函数作为参数传递给包含函数,并创建一个将工厂作为数据成员保存的结构。是否可以保留顶级函数变量并以某种方式用给定文件中的另一个实现覆盖一个实现?我已经尝试过以下方法:

type AirportFactory func (string, int, int) Airport

var makeAirport AirportFactory = func(n string, x int, y int) Airport {
    return airport{name: n, pos: Position{X: x, Y: y}}
}

makeAirport = func(n string, x int, y int) Airport {
    return airport{name:"default", pos:Position{X:0, Y:0}}
}

但是当我构建代码时,6g 在最后一个作业的结束行上给出了以下错误: 函数体外部的非声明语句

这使得函数类型的 var 看起来像是 const,至少在顶层是这样。有什么办法可以解决这个问题吗?

最佳答案

它们不是恒定的。您只是不能分配给函数外部已声明的变量。像这样的东西会起作用:

func changeAirport() {
    makeAirport = func(n string, x int, y int) Airport {
        return airport{name:"default", pos:Position{X:0, Y:0}}
    }
}

就 go 而言,函数外部的变量赋值不会以任何特定顺序发生。因此,您只能执行一次。

关于go - 可重新配置的函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11076656/

相关文章:

email - Gmail imap - 正文中的字符集错误

gorm exec 使用原始 sql 从插入事务返回 ID

go - 单值上下文中的多个值

interface - 如何实现可以接受可以在 golang 中进行相等性测试的任何类型的链表?

bash - 使用带有 Go 的 Git Bash/MINGW64 在 Windows 上捕获 CTRL-C

go - 未在float64上定义golang运算符%

javascript - 使用 Beego/GoLang 在模板中插入 JavaScript 代码片段

go - golang获取kubernetes资源(30000+ configmaps)失败

go - 如何从 http.ResponseWriter 获取数据以进行日志记录

go - 我如何从一个字节中获取位的子集?