首页 > 解决方案 > 如何将结构类型传递给模块函数?

问题描述

我只是玩了一点 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)
}

标签: go

解决方案


AppConfig 在您的配置结构类型的测试函数上,您已在主包中声明。由于 go 不支持循环依赖,因此您无法将 Configuration struct 导入 dbapi 包中以在其中使用它。所以,我会从主包中移动配置结构并在 dbapi 包中声明它。

package dbapi

import (...)

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 中使用它。

var AppConfig = dbapi.Configuration{}

因此,您的主包将如下所示:

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))  
}

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
}

推荐阅读