所以我刚开始学习Go编程语言,并花了几个小时来查看示例,引用等等.大多数人都同意,没有比学习语言更好的方法而不是潜入并做出某些东西,这正是我此刻想要做的事情.我正在构建一个Restful Web服务.我已经设法运行基础知识以及插入数据库,注册路由等.但是在过去的两天里,我一直在努力实现应用程序配置/属性.可能只是因为我是新手,我的Go项目架构都是错误的,因此为什么我遇到这样的困难.没有进一步的到期,这是我的项目结构
src
server
database
dbaccess.go
dbcomm.go
handling
handler.go
handlercomm.go
models
config.go
response.go
user.go
routing
routes.go
main.go
Run Code Online (Sandbox Code Playgroud)
这是我的config.go
package models
import (
"io/ioutil"
"encoding/json"
)
type Config struct {
Db map[string]string `json:"db"`
Server map[string]string `json:"server"`
}
func NewConfig(fname string) *Config{
data,err := ioutil.ReadFile(fname)
if err != nil{
panic(err)
}
config := Config{}
err = json.Unmarshal(data,&config)
if err != nil {
panic(err)
}
return config
Run Code Online (Sandbox Code Playgroud)
这是我的主要
func main(){
args := os.Args[1:]
if len(args) == 0{
fmt.Println("********************\nMust specify a config file in args\n********************")
os.Exit(1)
}
config := models.NewConfig(args[0])
port := config.Server["PORT"]
router := routing.NewRouter()
fmt.Printf( "-------------------------------------------------\n"+
"Listening and Serving on Port %s\n"+
"-------------------------------------------------",port)
log.Fatal(http.ListenAndServe(":"+port,router))
}
Run Code Online (Sandbox Code Playgroud)
最后这是我的路线映射的地方
type Route struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
var routes = []Route{
Route{
"signup",
"POST",
"/signup",
handling.PostSignUpUser,
},
Route{
"authenticate",
"POST",
"/login",
handling.PostLogin,
},
}
func NewRouter() *mux.Router{
router := mux.NewRouter().StrictSlash(true)
for _,route := range routes{
router.Methods(route.Method)
.Path(route.Pattern)
.Name(route.Name)
.Handler(route.HandlerFunc)
}
return router
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以在我的Main中看到,我从一个文件中初始化相关配置,这很好.但问题是如何在数据库包中使用main中的相同配置对象,因为我需要设置Host,Ports等?我可以再次解析文件,但我更愿意,如果我可以从一开始就共享那个对象.请指出我正确的方向
我的建议是声明一个全局变量config.go并使用该init()函数对其进行初始化。这样,您就知道该变量在任何包导入时都会被初始化。这是一些代码:
package models
import (
"io/ioutil"
"encoding/json"
)
var (
Configuration Config
)
init() {
args := os.Args[1:]
if len(args) == 0{
fmt.Println("********************\nMust specify a config file in args\n********************")
os.Exit(1)
}
Configuration = NewConfig(args[0]) // configuration initialized here
}
type Config struct {
Db map[string]string `json:"db"`
Server map[string]string `json:"server"`
}
func NewConfig(fname string) *Config{
data,err := ioutil.ReadFile(fname)
if err != nil{
panic(err)
}
config := Config{}
err = json.Unmarshal(data,&config)
if err != nil {
panic(err)
}
return config
}
Run Code Online (Sandbox Code Playgroud)
var()将在之前运行init(),但init()将在导入它的包中的代码之前运行。因此,如果main.go导入models包,则init()inmodels将在内部的任何代码之前运行main.go,因此该变量Configuration将在使用之前进行初始化。
现在你想要的只是提供一个可以在另一个包中使用的变量,解决方案很简单,记住,如果你声明一个以大写字母开头的变量名:[AZ],那么这个变量可以在另一个包中可见并使用去。
因此,您只需config在main.goto中重命名Config并将其提取为全局变量:
var Config *models.Config
func main(){
args := os.Args[1:]
if len(args) == 0{
fmt.Println("********************\nMust specify a config file in args\n********************")
os.Exit(1)
}
Config = models.NewConfig(args[0])
port := Config.Server["PORT"]
router := routing.NewRouter()
fmt.Printf( "-------------------------------------------------\n"+
"Listening and Serving on Port %s\n"+
"-------------------------------------------------",port)
log.Fatal(http.ListenAndServe(":"+port,router))
}
Run Code Online (Sandbox Code Playgroud)
当你想在另一个包中使用它时,只需调用<package name>.Config,包名称就是你的 main.go 所属的包名称,也许main在你的情况下。
| 归档时间: |
|
| 查看次数: |
5412 次 |
| 最近记录: |