package main
import "fmt"
func main() {
//new返回指針
p1 := new(int) //分配一個地址空間,new函數(shù)會返回地址p1,并會初始化值為0(類型的空值),地址指向(引用)的值可變
fmt.Printf("p1 --> %#v \n ", p1) //nil只能賦值給指針、channel、func、interface、map或slice類型的變量。如果將nil賦值給其他變量的時候?qū)l(fā)panic
fmt.Printf("p1 point to --> %#v \n ", *p1)
*p1 = 10
fmt.Printf("p1 --> %#v \n ", p1)
fmt.Printf("p1 point to --> %#v \n ", *p1)
var p2 *int
fmt.Printf("p2 --> %#v \n ", p2) //即沒有分配地址空間,不能引用
//fmt.Printf("p2 point to --> %#v \n ", *p2) //空指針的引用會導致編譯錯誤
var p3 *int //即沒有分配地址空間,不能引用
j := 5
jj := 10
p3 = &j //此時,p3指向地址,可以引用
fmt.Printf("p2 --> %#v \n ", p3) //0xc0420620b8
fmt.Printf("p2 point to --> %#v \n ", *p3) //5
p3 = &jj
fmt.Printf("p3 --> %#v \n ", p3) //0xc0420620c0
fmt.Printf("p3 point to --> %#v \n ", *p3) //golang中變量初始化分配內(nèi)存地址,j的地址沒有指針指向,0xc0420620b8地址指向的值暫時無法改變
var t int
fmt.Printf("t address --> %#v \n ", &t) //0xc042008110 由此可知,變量定義是會初始化地址,而且會賦予類型零值,
fmt.Printf("t value is --> %#v \n ", t)
t = 10
fmt.Printf("t --> %#v \n ", &t) //t 是0xc042008110指向值的引用,要使函數(shù)活方法中改變外部變量的值,必須傳遞指針,否則改變都是局部變量地址指向的值
fmt.Printf("t value now --> %#v \n ", t)
changeInt(t)
//x := 11
//&t = &x //指針不能運算
//make 用法,只能用于slice,map,channel,可用nil賦值
var s1 []int
if s1 == nil { //未初始化
fmt.Printf("s1 address --> %#v \n ", &s1)
fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil)
}
s2 := make([]int,3) // 返回的是引用類型,即可在函數(shù)中直接改變s2的值
if s2 == nil { //地址不為空,等號不成立
fmt.Printf("s2 is nil --> %#v \n ", s2)
} else { //初始化后,分配地址空間
fmt.Printf("s2 address --> %#v \n ", &s2)
fmt.Printf("s2 is not nil --> %#v \n ", &s2[0])// 0xc0420600c0
fmt.Printf("s2 is not nil --> %#v \n ", &s2[1])// 0xc0420600c8
fmt.Printf("s2 is not nil --> %#v \n ", s2)// []int{0, 0, 0}
}
changeSlice(s2)
}
func changeSlice(s []int) {
fmt.Printf("s[0] address --> %#v \n ", &s[0]) //0xc0420600c0 地址相同,說明是地址傳遞,map channel 邏輯相同,golang源碼中實現(xiàn)的邏輯
s[0] = 5
}
func changeInt(s int) {
fmt.Printf("t in func address --> %#v \n ", &s)
s = 5
}
go new make用法, nil賦值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- go的引用類型包含 slice、map、channel 內(nèi)置函數(shù)new和make創(chuàng)建引用類型的區(qū)別:new:會根據(jù)...
- Day 12 神句文檔 The team contends that these bear more than a...
- 背景介紹 make new make vs. new 代碼樣例 參考文檔 背景介紹 學習Go的時候,遇到了 mak...
- Go語言中new和make是內(nèi)建的兩個函數(shù),主要用來創(chuàng)建分配類型內(nèi)存。在我們定義生成變量的時候,可能會覺得有點迷惑...
- 了解一下其中的一些API接口。經(jīng)過了解才知道這只是一大個地圖包,并沒有提供現(xiàn)實的離線地圖的方案。帶我的師傅說可以了...