首先,问题中的“变量”一词可能有误,但我认为详细的问题解释了为什么我使用“变量”一词。
我有两个包含不同名称但功能完全相同的包。
根据用户的输入,我想使用包的功能。但是,我没有切换包,而是希望将包分配给具有通用名称的新功能,如何做到这一点?如果不可能,为什么?
// 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();
答案 0 :(得分:2)
您可以在包中定义一个接口,该接口需要您在这两个包中具有的功能。
package intfc
type Intfc interface {
Test()
}
然后在不同的包中实现该接口的两个结构
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")
}
然后在主要做这样的事情:
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
}
答案 1 :(得分:0)
在编译时import
实际上即使不是第一个被解析的指令。这意味着import指令中存在的任何包名称都将用作解析其他所有内容的参考。
因此,您不能像在Javascript中那样使用动态语言结构。 Cerise的回答是正确的。