如何将包分配给Go中的变量?

时间:2017-04-01 05:21:25

标签: go

首先,问题中的“变量”一词可能有误,但我认为详细的问题解释了为什么我使用“变量”一词。

我有两个包含不同名称但功能完全相同的包。

根据用户的输入,我想使用包的功能。但是,我没有切换包,而是希望将包分配给具有通用名称的新功能,如何做到这一点?如果不可能,为什么?

// 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();

2 个答案:

答案 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的回答是正确的。