golang中,變數宣告之後就已經分配記憶體了嗎?比如互斥鎖,宣告之後就可以直接使用?

時間 2021-06-06 09:09:37

1樓:Tony Bai

在Go中變數宣告後就分配了記憶體,這是確定無疑的。

但是否可直接用,還要看看下面兩個因素:如果變數是零值,那麼零值是否能直接用?變數值的意義是否符合業務邏輯要求。

變數宣告有兩種形式:一種是宣告時未顯式賦值的,Go編譯器會為之賦予零值。

比如:var a int // a = 0var s string // s = ""

var mu sync.Mutex

var b byte // b = nilb[1] = 'a'

12 定義「零值可用」的型別-慕課專欄

對於那些零值含義並不符合業務需求的,我們需要在宣告時對其顯式賦值(賦予滿足業務需求的值),這樣宣告後才算可直接使用:

var a int = 5

var s string = "hello"

var b = make(byte, 5)var p Person // 零值不符合業務需求。

var p = Person

2樓:nbody程式設計

在golang中,一切變數從宣告開始,就已經分配了記憶體,如果沒有進行初始化,將會是其型別的「零值」

舉個栗子:

package

main

import

"fmt"

type

test

struct

var(

_int

int_float

float64

_complex

complex128

_string

string

_bool

bool

_array[3

]int

_slice

int_map

map[

int]

int_chan

chan

int_pointer

*int

_struct

test

)func

main

()/*output:

int: 0

float64: 0

complex128: (0+0i)

bool: false

[3]int: [0 0 0]

int:

map[int]int: map 未初始化的map是nil

chan int:

*int:

main.test:

*/對於未進行初始化的結構體變數而言,「零值」是其各個屬性的型別的零值組合,比如:

type test struct

// 同樣:sync.Mutex也是乙個結構體

package sync // import "sync"

type Mutex struct

A Mutex is a mutual exclusion lock. The zero value for a Mutex is an

unlocked mutex.

A Mutex must not be copied after first use.

func (m *Mutex) Lock()

func (m *Mutex) Unlock()

這裡有講Golang中基本型別的「零值」:nbody程式設計:004 Golang基本資料型別 | 目標是成為Golang大師

golang中函式還有乙個比較隱晦的地方會宣告變數——命名返回值:

func testName() (ok bool使用該函式時已經宣告了ok這個變數

return

}testName() == false // true

thanks~

3樓:AFreeCoder

是的。比如你提到的互斥鎖,宣告之後:

var m sync.Mutex

m 就是乙個零值的 Mutex 變數。

然後像樓上提到的 channel,map,當然還有 slice,因為這三種型別都是引用型別,直接宣告變數後,這個變數僅僅是該型別的指標。

另外,如果這樣宣告互斥鎖:

var m *sync.Mutex

m 就是乙個零值的 Mutex 型別的指標,如果要使用互斥鎖,還需要再分配記憶體,像這樣:

var m *sync.Mutex

m = new(sync.Mutex)

這樣就可以直接使用了。

4樓:qiyaqingli

golang裡面變數的宣告了就是定義,記憶體就佔了的,可以直接用的。比如你說的鎖。這個和 c 語言不同。

但是有些場景要注意,比如 channel,map 這樣型別的複雜結構,你光是宣告定義還不行,因為只會分配乙個8位元組的指標。這種要呼叫make 函式來做初始化,之後才能使用。

js中用let宣告變數出錯時,變數依然被宣告且無法再賦值是什麼原理?

貘吃饃香 瀉藥LexicalBinding BindingIdentifier Initializer Let bindingId be StringValue of BindingIdentifier.Let lhs be ResolveBinding bindingId Let rhs be t...

普通宣告的變數為什麼沒有在原型鏈上?

不要熬夜啊 這個你得去問布蘭登 艾克,為什麼要把ECMAScript設計成這樣。不過雖然宣告的變數沒有在原型鏈上,但是我們卻有可能從原型鏈上獲取變數。在JS中,變數儲存在活動物件 AO 裡面,活動物件組成作用域鏈,獲取變數時會沿著作用域鏈解析。如果AO是有原型的,那麼識別符號 變數 的解析就會變成二...

c 在宣告結構指標變數的時候,會分配記憶體嗎?

瀉藥!函式clone沒有在堆上動態分配記憶體。struct S const structS clone structS R const structS bar structS R 生成中間表示式 struct.S type define arm aapcscc dereferenceable 1 s...