传递结构.

我是 Ruby 背景的新手。我试图在没有类的世界中理解代码结构,并且可能犯了一个错误,希望在 Go 中以“Ruby 方式”进行。


我正在尝试重构我的代码以使其更具模块化/可读性,因此我将配置文件的加载移动到了它自己的包中。好主意?


package configuration


import "github.com/BurntSushi/toml"


type Config struct {

    Temperatures []struct {

        Degrees int

        Units string

    }

}


func Load() Config {

    var cnf Config

    _, err := toml.DecodeFile("config", &cnf)

    if err != nil {

        panic(err)

    }

    return cnf

}

现在,在我的主包中:


package main


import "./configuration"


var conf Configuration = configuration.Load()

给undefined: Config。我明白为什么。我可以复制主包中的结构定义,但这不是很 DRY。


我的理解是,像这样传递结构体是一种不好的做法,因为它会使您的代码更难理解(现在每个人都需要了解我的 Config 结构体)。


在 Go 中像我试图在这里做的那样将逻辑隐藏在包中是一个好主意吗?如果是这样,传递这个 Config 结构的“Go”方式是什么?


慕沐林林
浏览 165回答 3
3回答

富国沪深

在您的主包中,您应该指定var conf configuration.Config = configuration.Load()configuration指的是您导入的包,并且Config是从该包中导出的结构(大写名称)。但是你也可以省略这个,因为可以推断类型var conf = configuration.Load()作为旁注:请不要使用相对导入

达令说

在 Go 导入中你总是声明你包的完整路径,不要在导入中使用相对路径,最好的例子是import "github.com/BurntSushi/toml"存在于以下位置的toml 导入:GOPATH/src/github.com/BurntSushi/toml GOPATH/pkg/_/github.com /BurntSushi/toml然后构建你的包和 main.gopackage mainimport "mypackage/configuration"func main() {   // configuration contain all funcs & structs    var conf configuration.Config = configuration.Load()}去它不是红宝石。参考包:https : //golang.org/doc/code.html

白衣染霜花

为什么不直接导入配置包,然后做 Go 的变量声明/实例化快捷方式呢?也许我错过了一些东西。package mainimport "mypackage/configuration"func main() {   conf := configuration.Load()}
打开App,查看更多内容
随时随地看视频慕课网APP