Go 传递结构

Go 传递结构,go,struct,Go,Struct,我是新手,来自红宝石背景。我试图理解在一个没有类的世界中的代码结构,并且可能犯了一个错误,我想用Go中的“Ruby方式”来实现它 我试图重构我的代码,使其更加模块化/可读,因此我将配置文件的加载移到了它自己的包中。好主意 package configuration import "github.com/BurntSushi/toml" type Config struct { Temperatures []struct { Degrees int Un

我是新手,来自红宝石背景。我试图理解在一个没有类的世界中的代码结构,并且可能犯了一个错误,我想用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()
给出
未定义:Config
。我明白为什么。我可以复制主包中的结构定义,但这不是很枯燥

我的理解是,像这样传递结构是一种不好的做法,因为它使代码更难理解(现在每个人都需要知道我的配置结构)


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

在主包中,您应该指定

var conf configuration.Config = configuration.Load()
configuration
指导入的包,
Config
指从该包导出的结构(大写名称)。但是您也可以忽略这一点,因为可以推断类型

var conf = configuration.Load()

作为旁注:请不要在您应该指定的主程序包中使用相对导入

var conf configuration.Config = configuration.Load()
configuration
指导入的包,
Config
指从该包导出的结构(大写名称)。但是您也可以忽略这一点,因为可以推断类型

var conf = configuration.Load()

作为旁注:请不要在Go导入中使用相对导入,因为您总是声明包的完整路径,不要在导入中使用相对路径,最好的例子是toml import
import“github.com/burntushi/toml”
,存在于: GOPATH/src/github.com/BurntSushi/toml GOPATH/pkg/551;/github.com/BurntSushi/toml

然后构建包并
main.go

package main

import "mypackage/configuration"

func main() {
   // configuration contain all funcs & structs 
   var conf configuration.Config = configuration.Load()
}
去吧,那不是鲁比


Ref Packages:

在Go导入中,您始终声明包的完整路径,不要在导入中使用相对路径,最好的示例是toml import
import“github.com/BurntSushi/toml”
存在于: GOPATH/src/github.com/BurntSushi/toml GOPATH/pkg/551;/github.com/BurntSushi/toml

然后构建包并
main.go

package main

import "mypackage/configuration"

func main() {
   // configuration contain all funcs & structs 
   var conf configuration.Config = configuration.Load()
}
去吧,那不是鲁比


Ref Packages:

为什么不导入配置包,然后执行Go的变量声明/安装快捷方式?也许我错过了什么

package main

import "mypackage/configuration"

func main() {
   conf := configuration.Load()
}

为什么不导入配置包,然后执行Go的变量声明/安装快捷方式?也许我错过了什么

package main

import "mypackage/configuration"

func main() {
   conf := configuration.Load()
}

首先,如果导出结构,则不需要在包之间复制结构。我想你的意思是使用
configuration.Config
?此外,除了快速测试外,不要使用相对导入。始终使用完整的导入路径。请参阅“如何编写Go代码”以获取有关的教程。@MuffinTop谢谢,这是一个很棒的资源!首先,如果导出结构,则不需要在包之间复制结构。我想你的意思是使用
configuration.Config
?此外,除了快速测试外,不要使用相对导入。始终使用完整的导入路径。请参阅“如何编写Go代码”以获取有关的教程。@MuffinTop谢谢,这是一个很棒的资源!快捷方式对我不起作用,因为我想在所有不同的函数中使用我的
conf
var,所以我在主函数之外声明它。但我明白你在解释什么。谢谢。这个快捷方式不适合我,因为我想在所有不同的函数中使用我的
conf
var,所以我在主函数之外声明它。但我明白你在解释什么。谢谢