go - 如何在 Go 中将包分配给变量?

标签 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();

最佳答案

您可以在一个包中定义一个接口(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/

相关文章:

go - 如何在 Go 中同步可变数量的 channel ?

google-app-engine - GOLANG HTTP Basic-Auth with Google App Engine URLFetch

firebase - Go SDK 上的 VerifyIDToken panic

java - 如何在Windows上的bazel中使用rules_go : generate . so文件

go - io.Copy写入: broken pipe for big file

go - Golang:如何编写通用函数,只能由_test文件使用,而对于非测试文件,这些函数将不可见

http - 如何在 http.ListenAndServe 中使用下一个可用端口

templates - Google Go 文本模板中范围最后一个元素的特殊情况处理

google-app-engine - 如何使用go语言在google app engine中按键获取实体

go - 动态更改代码间隔