變數是存值,而指標存的是變數的位址,所以可以透過指標來讀取或修改變數的值.
package main
import (
"fmt"
)
func main() {
name := "Daniel"
pname := &name
fmt.Println(pname) //印出 0xc0000541c0
fmt.Println(*pname) //印出 Daniel
*pname = "Jack" // 相當於 name = "Jack"
fmt.Println(name) //印出 Jack
}
任何型別的指標的零值為 nil
var name *int
fmt.Println(name) // 印出 nil
var str *string
fmt.Println(str) // 印出 nil
有給位址時就不為 nil 了
var str *string
fmt.Println(str == nil) // 印出 true
var name = "Daniel"
str = &name
fmt.Println(str == nil) // 印出 false
function 可以回傳區域變數的位址,讓外部可以參照到區域變數,每次呼叫的位址會不一樣.
package main
import (
"fmt"
)
func getName() *string {
name := "Daniel"
return &name
}
func main() {
var name = getName()
mt.Println(name == getName()) // 印出 false
fmt.Println(*name) // 印出 "Daniel"
*name = "Sam"
fmt.Println(*name) // 印出 "Sam"
}
傳位址給 function,function 就可以直接對該位址的變數修改值
package main
import (
"fmt"
)
func add(num *int) int {
*num++
return *num
}
func main() {
sum := 0
fmt.Println(add(&sum)) // 印出 1
fmt.Println(add(&sum)) // 印出 2
fmt.Println(add(&sum)) // 印出 3
}
go 可以使用 ++ 及 -- 符號,i++ 代表 i = i + 1,i-- 代表 i = i - 1
func sub(num *int) int {
*num--
return *num
}
func main() {
sum := 10
fmt.Println(sub(&sum)) // 印出 9
fmt.Println(sub(&sum)) // 印出 8
fmt.Println(sub(&sum)) // 印出 7
}
go 一次可以 assign 多組變數,所以可以很方便交換兩個值,如果 funtion 有回傳兩個值,可以使用 _ 略過不需要的
package main
import (
"fmt"
)
func getNums() (a string, b string) {
return "3", "4"
}
func main() {
var num1, num2 = "1", "2"
num1, num2 = num2, num1
fmt.Println(num1 + " , " + num2) // 印出 2, 1
var num3, num4 string
_, num3 = getNums()
fmt.Println(num3) // 印出 4
num4, _ = getNums()
fmt.Println(num4) // 印出 3
}