###### tags: `Golang` # 指標 ### 指標變數 指向計位址的變數,是為一種型別,可當做變數使用的都是一種型別。 指標變數的初始值皆是nil,代表尚未指派位址, ```go= var ptr *string fmt.Printf("%p \n",ptr) // 0X0 if ptr == nil{ fmt.Println("ptr is nil") } ``` 完成宣告變數後,可透過**取址符號「&」**,取出該字串之記憶體位址,然後賦值給ptr, 透過格式化輸出(%p)可印出記憶體位址,若是想要取得該記憶體位址的值, 就必須使用**取值符號「*」**,取出指標所指向記憶體位址所儲存的值。 ```go= // * -> 取值符號 // & -> 取址符號 var ptr *string //宣告指標變數 str := "Iron" //宣告字串變數及初始化值 ptr = &str //將str的記憶體位址給ptr fmt.Printf("%p \n", ptr) //印出str的記憶體位址 fmt.Printf("%s \n", *ptr) //印出該位址的值 fmt.Printf("字串變數str的記憶位址為%p,值為%s \n", ptr, *ptr) //0xc0000961e0 //Iron //字串變數str的記憶位址為0xc0000961e0,值為Iron ``` ### 型別區分 指標變數的型別以所要指向的變數型別為主,若要指向string變數, 宣告指標變數時就要以string做宣告, 變數型別與指標變數型別不一樣時,則會出錯。 ### 指標與函數 **取值符號「*」** 可以讀取也可以修改,swap宣告兩個指標變數接收變數的記憶體位址, 並將該記憶體位址的值交換,如此可達成不須return也能取得函式結果。 ```go= func swap(a, b *int) { //此函式宣告了a和b兩個指標變數 *a, *b = *b, *a //將該位址的值做交換 } func main() { a, b := 1, 2 swap(&a, &b) //傳送變數的記憶體位址 fmt.Printf("a:%d / b:%d \n", a, b) } ``` ### new() 動態產生一個變數空間,即先產生一個彈性的記憶體空間,依據所存入值的大小做改變, 適用於操作大量且不固定的記憶體空間。 ```go= ptr := new(string) fmt.Printf("記憶體位址: %p,值:%s\n", ptr, *ptr) //存入值之前就有記憶體位址 *ptr = "Iron" fmt.Printf("記憶體位址: %p,值:%s\n", ptr, *ptr) //記憶體位址: 0xc0000961e0,值: //記憶體位址: 0xc0000961e0,值:Iron ``` # Dark Theme CSS {%hackmd theme-dark %}