go语言的神奇特性
go语言有一个神奇的特点,那就是运行go run main.go
命令的时候,如果main.go还引用了main包下面的utils.go的hello
方法,那么就会报错:
bash
cmd/kratos_demo/main.go:77:23: undefined: hello
翻译成更容易理解的话就是:在默认的情况下,go不允许在main.go文件中导入同包的其他文件。
要解决这个问题,通常的解决方案是,把引用到的全部都加到go run的参数里面:
bash
go run main.go utils.go
或者
bash
go run *.go
kratos框架如何解决这个问题
如果想在kratos框架成功启动,通常使用kratos run
命令
bash
kratos run
另外,你还可以这样做:
bash
go run cmd/kratos_demo/main.go cmd/kratos_demo/wire_gen.go -conf configs/config.yaml
但是,如果你使用go run *.go的方式启动,就会报错:
bash
> go run cmd/kratos_demo/*.go -conf configs/config.yaml
# command-line-arguments
cmd/kratos_demo/wire_gen.go:26:6: wireApp redeclared in this block
cmd/kratos_demo/wire.go:21:6: other declaration of wireApp
为什么会这样?因为在相同的目录下,有wire.go和wire_gen.go,它们都有相同的wireApp
方法,因此会报错。
vscode如何设置kratos的调试?
在vscode的调试配置在launch.json文件中。
错误方案一:program参数设置多个文件的?
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "./cmd/kratos_demo/main.go ./cmd/kratos_demo/wire_gen.go",
"args": ["-conf", "./configs/config.yaml"]
}
]
}
这样设置vscode会报错,因为program参数只能接受一个文件。
错误方案二:把./cmd/kratos_demo/wire_gen.go放到args中
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "./cmd/kratos_demo/main.go",
"args": ["./cmd/kratos_demo/wire_gen.go", "-conf", "./configs/config.yaml"]
}
]
}
这样会报错:
bash
Build Error: go build -o /Users/xxx/workspace/kratos_demo/cmd/kratos_demo/__debug_bin -gcflags all=-N -l ./main.go
# command-line-arguments
./main.go:77:23: undefined: wireApp (exit status 2)
正确方案
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "./cmd/kratos_demo/"
}
]
}
这样就能愉快的进行调试啦。