goland在web中存在的問題

2021-09-05 07:21:04 字數 1478 閱讀 2372

官方文件中明確指出,slice(切片)的零值是 nil,在沒有明確初始化的情況下這是顯而易見的,任何 go 開發者應該都知道才對。

但是對於 goland 而言,宣告並直接初始化的空 slice 和宣告不初始化 slice 是一回事。為什麼這麼說呢?如果你在 goland 中寫入以下兩句**:

var slicenoinit string

sliceinit := string{}

第二行**的等號右邊會有波浪線,提示這種寫法可以被 cleanup。如果你根據 ide 提示按 alt +enter 那麼第二行**會被重構成:

var sliceinit string

你沒有看錯,goland 將乙個初始化過的 slice 重構為了未初始化的的 slice…… goland 認為前者是冗餘的寫法。的確,大部分函式對於 nil slice 和 empty slice 而言,都是一樣的,例如它們的長度都是 0。不過

nil slice 的長度為 0,所以長度為 0 的都可以轉變 nil slice

這樣考慮就有問題了。這有什麼問題嗎?它們兩個長度不都是零麼?當然有問題,在 len 函式的注釋清晰的寫了這麼一句話:

if v is nil, len(v) is zero

這是什麼意思呢?就是說 len 函式允許引數為 nil,但只要引數為 nil 不管任何型別都會返回 0。所以 nil slice 的長度為零是一種不嚴禁的說法,應該說呼叫 len 函式的結果為零。

所以,初始化後空的 slice 是絕對不等同於沒有初始化的 nil slice 的。最直接的,它們對 slice == nil 的結果就相反。

我們用偽**舉例(不涉及具體框架):

var list string

if err,result := queryall();err== nil

tojson(map[string]inte***ce{})

有沒有看出什麼問題?如果 queryall 返回錯誤的話,那麼 list 永遠不會被初始化,則很有可能在轉換時被解析為 null 而不是 。如果你想這麼寫解決這個弊端:

list := string{}

那麼你會被 goland 活活糾正成上面那樣…… 然後帶來錯誤的結果。

進入 settings -> editor - inspections

展開 go - declaration redundancy

將 empty slice declared via literal 右邊的勾去掉

這麼做可以關掉 goland 對直接初始化的空 slice 的冗餘檢查。

不過有意思的是還有一種以**的方式杜絕這種提示,那就是使用 make 函式:

list := make(string, 0)

實際上使用 make 建立乙個長度為 0 的 empty slice 和不插入乙個值的直接初始化這兩者才是等價的…… 但是 goland 卻不會將 make 函式這種初始化方式算做「冗餘」寫法。

[推薦](

在goland中配置gofmt的操作

goland是jetbrains公司推出的go語言ide,是一款功能強大,使用便捷的產品。在goland中,可以通過新增乙個file watcher來在檔案發生變化的時候呼叫gofmt進行 格式化,具體方法是,點選preferences tools file watchers,點加號新增乙個go f...

解決GOPATH在GOLAND中的坑

首先我的環境已配置好 go的目錄結構是 add.go package calc 函式名必須大寫首字母,不然外部包找不到 func add a int,b int int sub.go pac calc func sub a int,b int int 執行檔案,main.go package mai...

goland中grpc的安裝

網路環境允許的同學安裝 grpc 非常方便,直接執行以下命令即可安裝完成 i o timeout 埠號根據實際情況寫 windows使用set設定環境變數。export使用export 7890 widows設定方法 set go111module auto go1.14版本存在的選項 linux設...