Golang Go语言 请教一个包导入问题,百思不得解
Golang Go语言 请教一个包导入问题,百思不得解
项目结构如下:
decoder
├── config.json
└── decoder.go
config.json 文件内容
{
"ServerInfo": {
"Host": "127.0.0.1:8888"
},
"RedisInfo": {
"Host": "127.0.0.1:6379",
"MaxIdle": 16,
"MaxActive": 0,
"IdleTimeout": 300
}
}
decoder.go 文件内容
package main
import (
“encoding/json”
“fmt”
“os”
“time”
)
type Config struct{}
type ConfigurationType struct {
ServerInfo ServerInfoType
RedisInfo RedisInfoType
}
type ServerInfoType struct {
Host string
}
type RedisInfoType struct {
Host string
MaxIdle int
MaxActive int
IdleTimeout time.Duration
}
var Configuration = ConfigurationType{}
func (this Config) InitConfig() {
file, _ := os.Open(“config.json”)
defer file.Close()
decoder := json.NewDecoder(file)
Configuration = ConfigurationType{}
err := decoder.Decode(&Configuration)
if err != nil {
fmt.Println("Error: ", err)
}
fmt.Printf(“Configuration: %v\n”, Configuration)
}
func main() {
conf := Config{}
conf.InitConfig()
}
这种情况下我运行:go run decoder.go
, 输出结果如下:
Configuration: {{127.0.0.1:8888} {127.0.0.1:6379 16 0 300ns}}
但是我把这个 main 包改为 decoder 包,项目结构调整如下
.
├── decoder
│ ├── config.json
│ └── decoder.go
└── main.go
config.json 文件内容
{
"ServerInfo": {
"Host": "127.0.0.1:8888"
},
"RedisInfo": {
"Host": "127.0.0.1:6379",
"MaxIdle": 16,
"MaxActive": 0,
"IdleTimeout": 300
}
}
decoder.go 文件内容
package decoder
import (
“encoding/json”
“fmt”
“os”
“time”
)
type Config struct{}
type ConfigurationType struct {
ServerInfo ServerInfoType
RedisInfo RedisInfoType
}
type ServerInfoType struct {
Host string
}
type RedisInfoType struct {
Host string
MaxIdle int
MaxActive int
IdleTimeout time.Duration
}
var Configuration = ConfigurationType{}
func (this Config) InitConfig() {
file, _ := os.Open(“config.json”)
defer file.Close()
decoder := json.NewDecoder(file)
Configuration = ConfigurationType{}
err := decoder.Decode(&Configuration)
if err != nil {
fmt.Println("Error: ", err)
}
fmt.Printf(“Configuration: %v\n”, Configuration)
}
main.go 文件内容
package main
import “initTest/decoder”
func main() {
t := decoder.Config{}
t.InitConfig()
}
测试运行 go run main.go
报错如下:
Error: invalid argument
Configuration: {{} { 0 0 0s}}
请问是否有人知道是什么原因?
更多关于Golang Go语言 请教一个包导入问题,百思不得解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这不是包导入的问题, file, _ := os.Open(“config.json”) 你用的是相对路径,会从运行的工作目录(执行 go run main.go 的目录)下查找,实际上代码运行到这一步就出错了,找不到文件. 配置文件路径应该用函数参数去传递,而不是写死在函数里面. 要正确处理 error.
更多关于Golang Go语言 请教一个包导入问题,百思不得解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
哎哟,我去,被闪了腰。现在用的语言文件找不到直接是跑出了异常,go 语言这种直接返回 err 的还真的不太习惯。
将 decoder.go InitConfig 方法改了:<br>...<br>func (this Config) InitConfig() {<br> file, err := os.Open("config.json")<br> defer file.Close()<br> if err != nil {<br> fmt.Printf("Open file error: %v\n", err)<br> }<br><br> decoder := json.NewDecoder(file)<br> Configuration = ConfigurationType{}<br> err = decoder.Decode(&Configuration)<br> if err != nil {<br> fmt.Println("Error: ", err)<br> }<br> fmt.Printf("Configuration: %v\n", Configuration)<br>}<br>
将读文件的 err 信息打印出来了。
感谢!
再挑个次要问题,defer file.Close()应该放在 if err != nil 之后
这是为什么呢?defer
语句不是在方法返回前触发的吗?
如果打开文件若有错误发生,就不需要调用 file.Close(),所以写在 if err!=nil 语句后面。
你的意思是这样?<br>if err != nil {<br><br>}<br>
你的意思是这样?<br>if err != nil {<br> defer file.close()<br>}<br>
if err != nil {
return err
}
defer file.close()
任何时候别忽略 err
我也很烦 golang 每次都要判断 err,所以一般就写个函数
func checkErr(err error){
if err != nil{
// do something
}
}
这样每次都只直接调用这个 checkErr,而不是判断它是不是等于 nil 了,比较偷懒的写法
不错,经过测试发现自己对 defer 返回前调用理解有误。
您好!关于您在Go语言中遇到的包导入问题,这里有几个常见的排查和解决步骤,希望能帮您找到答案:
-
检查包路径: 确保您导入的包路径是正确的。Go语言使用GOPATH或GOMODULE来管理依赖,路径错误会导致编译失败。如果是自定义包,请确认包的相对路径或模块路径无误。
-
初始化Go Module: 如果您的项目使用Go Modules(Go 1.11及以上版本),请确保在项目根目录下运行
go mod init <module-name>
来初始化模块。之后,使用go get
命令来添加依赖。 -
检查Go环境变量: 确认GOPATH和GOROOT环境变量设置正确。GOPATH是您的工作区目录,GOROOT是Go语言的安装目录。
-
清理缓存: 有时候,Go的缓存可能会导致导入问题。尝试运行
go clean -cache
或go clean -modcache
来清理缓存。 -
查看错误信息: 详细阅读编译器给出的错误信息,它通常会指出问题所在,比如路径不存在、包名冲突等。
-
IDE或编辑器问题: 如果您使用的是IDE或编辑器(如VSCode、GoLand),确保它们正确配置了Go环境,并且支持Go Modules或GOPATH。
如果以上步骤仍未解决问题,您可以提供更具体的错误信息或代码示例,以便进一步分析。希望这些建议能帮到您!