猿问

如何将结构类型传递给模块函数?

我只是玩了一下 Go 来学习如何处理。

我有一个主要的围棋程序。我为数据库模块创建了一个子文件夹,因为我想要执行数据库操作。

对于参数,我有一个带有凭据等的结构类型。如何将结构传递给模块?

我想要配置结构中所需的所有配置和全局变量,并在需要时将其传递给模块。

这是实现目标的好方法吗?谢谢您的帮助。

./main.go:

package main


import (

    //...

    "github.com/wyrdnixx/go-server/src/go-server/dbapi"

)


func handlerTest(w http.ResponseWriter, r *http.Request) {

    log.Println("INFO: /test was requested...")

    dbapi.Test(&AppConfig)

}

func main() {

    http.HandleFunc("/test", handlerTest)

    AppConfig = ReadConfig()

    log.Fatal(http.ListenAndServe(AppConfig.ApiPort, nil))

}


type Configuration struct {

    ApiPort    string

    DBHost     string

    DBPort     string

    DBUser     string

    DBPassword string

    DBName     string

    Info       string

}


var AppConfig = Configuration{}


func ReadConfig() Configuration {


    err := gonfig.GetConf("./config.development.json", &AppConfig)

    if err != nil {

        fmt.Println("ERROR: Config konnte nicht geladen werden: ", err.Error())

    }

    return AppConfig

}

./dbapi/test.go:


package dbapi


import (

    // ...

)


func Test (w http.ResponseWriter, Appconfig /* ?!? */) error {

    fmt.Println("Test: " + Appconfig.DBUser)

}


回首忆惘然
浏览 141回答 2
2回答

倚天杖

在主目录下创建另一个包,将其命名types为任何您想要的名称。就像下面这样:将您的structure对象移动到types.gopackage typestype Configuration struct {    ApiPort    string    DBHost     string    DBPort     string    DBUser     string    DBPassword string    DBName     string    Info       string}main.go现在您可以从您的和访问它dbapi/test.go。main.go:package mainimport "... .../code/types"func handlerTest(w http.ResponseWriter, r *http.Request) {    log.Println("INFO: /test was requested...")    dbapi.Test(&AppConfig)}func main() {    http.HandleFunc("/test", handlerTest)    AppConfig = ReadConfig()    log.Fatal(http.ListenAndServe(AppConfig.ApiPort, nil))}var AppConfig = types.Configuration{}func ReadConfig() types.Configuration {    err := gonfig.GetConf("./config.development.json", &AppConfig)    if err != nil {        fmt.Println("ERROR: Config konnte nicht geladen werden: ",     err.Error())    }    return AppConfig}dbapi.go:package dbapiimport "... .../code/types"func Test (w http.ResponseWriter, Appconfig *types.Configuration) error {    fmt.Println("Test: " + Appconfig.DBUser)}

沧海一幻觉

AppConfig 位于您已在主包中声明的配置结构类型的测试函数上。由于 go 不支持循环依赖,因此您无法将 Configuration 结构导入 dbapi 包中以在其中使用它。因此,我将从主包中移动 Configuration 结构并在 dbapi 包中声明它。package dbapiimport (...)type Configuration struct {    ApiPort    string    DBHost     string    DBPort     string    DBUser     string    DBPassword string    DBName     string    Info       string}func Test (w http.ResponseWriter, Appconfig *Configuration) error {    fmt.Println("Test: " + Appconfig.DBUser)}然后,您可以通过从 dbapi 包导入来使用 main 中的 Configuration 结构。var AppConfig = dbapi.Configuration{}所以,你的主包看起来像这样:package mainimport(..."github.com/wyrdnixx/go-server/src/go-server/dbapi")func handlerTest(w http.ResponseWriter, r *http.Request) {    log.Println("INFO: /test was requested...")    dbapi.Test(&AppConfig)}func main() {    http.HandleFunc("/test", handlerTest)    AppConfig = ReadConfig()    log.Fatal(http.ListenAndServe(AppConfig.ApiPort, nil))  }var AppConfig = dbapi.Configuration{}func ReadConfig() dbapi.Configuration {    err := gonfig.GetConf("./config.development.json", &AppConfig)    if err != nil {        fmt.Println("ERROR: Config konnte nicht geladen werden: ",     err.Error())    }     return dbapi.AppConfig}
随时随地看视频慕课网APP

相关分类

Go
我要回答