首先,问题中的“变量”一词可能有误,但我认为详细的问题解释了我使用“变量”一词的原因。
我有两个名称不同但功能完全相同的包。
根据用户的输入我想使用一个包的功能。但是我不想切换包,而是想将包分配给具有通用名称的新函数,该怎么做?如果不可能,为什么?
// foo/bar.go
package foo
func Test() {
fmt.Println("hola from bar")
}
// baz/bar.go
package baz
func Test() {
fmt.Println("hola from baz")
}
// main.go
package main
import (
"foo"
"baz"
)
func main() {
thePackage := flag.String("package", "foo", "a package")
if thePackage == "foo" {
howToSetThis := foo // How to do this?
} else {
howToSetThis := baz // How to do this?
}
howToSetThis.Test() // execs Println from one of the two bar.go files
}
在 JavaScript 中我会做类似(简化)的事情:
function foo(){
console.log("hola from foo")
}
function baz(){
console.log("hola from baz")
}
if(somethingInput == "foo"){
var howToSetThis = foo;
} else {
var howToSetThis = baz;
}
howToSetThis();
最佳答案
您可以在一个包中定义一个接口(interface),该接口(interface)需要您希望在这两个包中拥有的功能。
package intfc
type Intfc interface {
Test()
}
然后是实现该接口(interface)的不同包中的两个结构
package foo
import "fmt"
type Foo struct {
}
func (f Foo) Test() {
fmt.Println("hola from foo")
}
和
package baz
import "fmt"
type Baz struct {
}
func (f Baz) Test() {
fmt.Println("hola from baz")
}
然后在 main 中做这样的事情:
package main
import (
"foo"
"baz"
"intfc"
"flag"
)
func main() {
var howToSetThis intfc.Intfc
thePackage := flag.String("package", "foo", "a package")
if *thePackage == "foo" {
howToSetThis = foo.Foo{}
} else {
howToSetThis = baz.Baz{}
}
howToSetThis.Test() // execs Println from one of the two bar.go files
}
关于go - 如何在 Go 中将包分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153133/