解決golang 關於全域性變數的坑

2022-09-27 08:30:14 字數 1412 閱讀 7405

學習golang不久,在定義全域性變數的時候遇見了坑。寫個小例子,增強記憶。

var p int

func main()

}func test(i int) (int, error)

編譯一直不通過,p declared and not used。後來查了查資料,看見這種其實是在main裡邊又重新定義了p,所以一直提示p定義了但是沒有使用。修改如下:

var p int

func main()

}func test(i int) (int, error)

補充:golang變數作用域問題-避免使用全域性變數

最近遇到了乙個變數kwlvice作用域的問題,乙個比較低階的問題,可能作為乙個熟手不應該犯這樣的低階錯誤,但是golang的語法特點可能讓你稍微不注意就踩坑,嘿嘿。

全域性變數的作用域是整個包,區域性變數的作用域是該變數所在的花括號內,這是乙個很基礎的問題。

我們通常會使用golang的乙個語法糖:=來給變數賦值,這種方式可以節省掉我們定義變數的**,讓**變的更加簡潔,但是如果你定義了乙個全域性變數,又不小心用:=來給它賦值,就會出現一些問題。

看下面的**,定義了乙個全域性變數t,我想在init()中給他賦值為2,然後在main中使用它。

var t int

func init()

fmt.println("init:", t)

}程式設計客棧

func main()

輸出:init: 2

main: 0

執行之後,在init和main中列印出了不一樣的數字,為什麼會不一樣呢,可能你仔細一看就知道原因了。很簡單,init中的t是用:=生成的,所以t是區域性變數,在init函式中覆蓋了全域性變數t。全域性變數t並沒有被賦值,它還是原來的0值。

我本想在init中給全域性變數t賦kwlvice值的,卻不小心用:=建立了乙個區域性變數導致全域性變數t沒有賦值成功,犯了乙個低階錯誤。

知道原因之後就容易解決了,我不使用:=就可以了。**如下:

var t int

func init()

fmt.println("init:", t)

}func main()

輸出:init: 2

main: 2

沒有使用:=之後,init中的t就是全域性變數t,給全域性變數t賦值為2,main中自然輸出的就是2,實現了我最初的目的。

這個問題很簡單很低階,但是可能乙個golang熟手,在**遠比demo要複雜的多的實際專案中,不經意間就可能會犯下這樣的錯誤。

這個問題很難保證說下次一定不會出現的,除非你徹底不用全域性變數或者徹底不用:=這樣的語法糖。

盡量少的使用全域性變數。

盡量少的使用:=語法糖。

使用:=的時候要確保左值沒有被定義過。

本文標題: 解決golang 關於全域性變數的坑

本文位址:

關於 全域性變數

全域性變數一般這樣定義 1。在一類的.cpp中定義 int myint 然後再在要用到的地方的.cpp裡extern int myint 這樣就可以用了。2。在stdafx.cpp中加入 int myint 然後在stdafx.h中加入 extern int myint 這樣定義以後無論在什麼檔案中...

關於python全域性變數

描述global best pec1 def main best prec1 1 train def train print best prec1 報錯 best prec1沒有定義。原因 當函式中定義同名的區域性變數時,原來定義的全域性變數會被區域性變數覆蓋掉。因此train 中就不再有變數bes...

關於全域性變數 01

take off land.件 bool ctrl ref valid false take off land.cpp檔案,有自己的main函式 include take off land.h void main traj server.cpp檔案,有自己的main函式 include take o...