GO 学习笔记之零 (三)常见问题处理集锦

1、Golang如何解决case-insensitive import collision问题

1.1 现象

1.2 解决方法

    该问题产生说明在所有go文件中引入包时,存在 ShipModel/Radar 和 ShipModel/radar 两种写法,需要统一。

     对于VSCODE工具,可以在 全局文件中搜索 ShipModel/Radar 查看 写法是不是一样,然后 进行统一,要么全部改成 ShipModel/Radar 或者全部改成  ShipModel/rada

2、panic: runtime error: invalid memory address or nil pointer dereference [recovered]

2.1 现象

      代码中 在 test.go 定义了全局变量(类型为自定义类型 struct),且通过init函数对该函数进行了初始化赋值。但是在利用 gin 框架 编写了 controller 层之后 使用  net/http/httptest 进行了单元测试,单元测试代码如下:

复制代码
package test

import (
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/gin-gonic/gin"
    "github.com/stretchr/testify/assert"
    "test.com/pkg/server"

    "test.com/internal/controller"
)

func initEngine() *gin.Engine {
    engine := server.Register()
    for _, _method := range controller.RegisterFuncs {   //其中 _method 方法是 将 controller接口全部注册到 engine 引擎中,直接调用方法的时候,方法中会去执行全局变量对应类型的方法,但是此时提示 全局变量中的各个属性都是 nil。 造成单元测试执行失败
        _method(engine)
    }
    return engine
}

func TestHelloRoute(t *testing.T) {
    router := initEngine()

    w := httptest.NewRecorder()
    req, _ := http.NewRequest("GET", "/api/backup/hello", nil)
    router.ServeHTTP(w, req)

    assert.Equal(t, 200, w.Code)
    //assert.Equal(t, "pong", w.Body.String())
}
复制代码

 

 

2.2 解决方法 

 经过百度查找资料 发现产生的原因是,通过 init() 函数初始化 全局变量时使用了 :=  导致的,需要更改成 = ,如果使用  := 表示还是局部变量

具体可参考资料: golang全局变量的一个坑,main中无法获取init初始化的变量 - 大墨垂杨 - 博客园      其中有详细说明

 

posted @   夏之夜  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示