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 testimport ("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初始化的变量 - 大墨垂杨 - 博客园 其中有详细说明