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...