###### 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 %}