在Go教程中,以及我看过的大多数Go代码,包都是这样导入的:
import (
"fmt"
"os"
"launchpad.net/lpad"
...
)
Run Code Online (Sandbox Code Playgroud)
但是在http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go中,gocheck包导入了一个.(句点):
import (
"http"
. "launchpad.net/gocheck"
"launchpad.net/lpad"
"os"
)
Run Code Online (Sandbox Code Playgroud)
.(期间)有什么意义?
我正在创建三个非常相似的应用程序,但每个应用程序将应用不同的逻辑.我不知道如何最好地构建它以避免重复代码.
所有应用程序都有以下共同点: - 读取和解析配置 - 设置SQL数据库连接 - 收集统计信息 - 从STDIN读取
每个应用程序将对从STDIN读取的数据应用不同的逻辑.
这会被认为是可接受的吗?将所有常用代码放在main.go中,然后构建为"go build -o bin/app1 main.go app1.go"等等 - 只为每个二进制文件提供特定于应用程序的逻辑来构建?
main.go:
func main() {
// db connection
// stats worker
// read from stdin
proccessLine(line)
}
Run Code Online (Sandbox Code Playgroud)
app1.go:
func processLine(line string) {
// logic for app 1
}
Run Code Online (Sandbox Code Playgroud)
app2.go:
func processLine(line string) {
// logic for app 2
}
Run Code Online (Sandbox Code Playgroud)
等等
我有以下项目结构:
myGithubProject/
|---- cmd
|----- command
|----- hello.go
|---- internal
|----- template
|----- template.go
|----- log
|----- logger.go
main.go
Run Code Online (Sandbox Code Playgroud)
在log与template处于同一水平(在内部封装)在logger.go使用即时通讯logrus与一些配置沙子记录我想用logger.go 的内部对象template包。我应该如何以一种干净的方式做到这一点?
目前我使用它 import logger在template.go文件中,
而在internal包装下,我6还有更多packages需要它的地方logger。他们每个人都依赖它。(在log包装上)有什么好处理的吗?
更新:
如果我还有更多需要传递的内容(例如logger),这里的方法/模式是什么?也许使用dependency injection?interface?其他干净的方法...
我需要一些最佳实践的完整示例,该如何logger在hello.go文件中以及在中使用template.go。
这是我的项目
cliProject/main.go
package main
import (
"cliProject/cmd"
"cliProject/internal/logs"
)
func main() {
cmd.Execute()
logs.Logger.Error("starting")
} …Run Code Online (Sandbox Code Playgroud)