Golang Go语言 请教一个包导入问题,百思不得解

发布于 1周前 作者 caililin 来自 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

12 回复

这不是包导入的问题, 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(&amp;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语言中遇到的包导入问题,这里有几个常见的排查和解决步骤,希望能帮您找到答案:

  1. 检查包路径: 确保您导入的包路径是正确的。Go语言使用GOPATH或GOMODULE来管理依赖,路径错误会导致编译失败。如果是自定义包,请确认包的相对路径或模块路径无误。

  2. 初始化Go Module: 如果您的项目使用Go Modules(Go 1.11及以上版本),请确保在项目根目录下运行go mod init <module-name>来初始化模块。之后,使用go get命令来添加依赖。

  3. 检查Go环境变量: 确认GOPATH和GOROOT环境变量设置正确。GOPATH是您的工作区目录,GOROOT是Go语言的安装目录。

  4. 清理缓存: 有时候,Go的缓存可能会导致导入问题。尝试运行go clean -cachego clean -modcache来清理缓存。

  5. 查看错误信息: 详细阅读编译器给出的错误信息,它通常会指出问题所在,比如路径不存在、包名冲突等。

  6. IDE或编辑器问题: 如果您使用的是IDE或编辑器(如VSCode、GoLand),确保它们正确配置了Go环境,并且支持Go Modules或GOPATH。

如果以上步骤仍未解决问题,您可以提供更具体的错误信息或代码示例,以便进一步分析。希望这些建议能帮到您!

回到顶部