我有一些工人。我不想通过我的包传播源类型,而是传播到用户界面。因此,我有:
package package_one
type T func(map[string]interface{}) interface{}
func Func(f T) {
package_two.Func(f)
}
package package_two
...
type T func(map[string]interface{}) interface{}
func Func(f T) {
fmt.Printf("%v", f(nil))
}
...
package main
func main() {
package_one.Func(func(m map[string]interface{}) interface{} {
return "result"
})
}
当package_one.Func()
调用package_two.Func()
时,我收到错误。我假设尽管签名相等,编译器不会将package_one.T
和package_two.T
视为同一类型。为什么会这样?我想避免运行时强制转换和检查结果,因为它很冗长并且需要错误处理。如果我可以在编译阶段将其定义为相同的类型,生活可能会更容易。可能吗?
使用表达式package_two.T(f)
转换值。 此转换不会产生运行时成本。转换没有要检查的错误。
package package_one
import "play.ground/package_two"
type T func(map[string]interface{}) interface{}
func Func(f T) {
package_two.Func(package_two.T(f))
}
在操场上运行它。 https://play.golang.org/p/3umm81iNAjk