指標是寫出優秀程式碼最重要的部分之一。在這篇文章中,我們將探索指標是什麼,以及如何在 Go 中使用它們。
1. 什麼是指標
#指標是儲存其指向位址的變數(強調一下,只是儲存數值的變數)。 【相關建議:Go影片教學】
特定類型的指標只能指向該類型(指標指向的資料類型不可變)。
2. GoLang 指標語法
指標的語法非常簡單。以下是 Go 中指標聲明的語法。
1 2 | var ptr *type
var ptrint *int
|
登入後複製
#指標的零值是 nil。
3. Go 中指標的初始化
類型的指標使用&
對其進行初始化:
1 2 3 4 5 6 7 8 9 10 11 12 | package main
import (
"fmt"
)
func main() {
var q int = 42
var p *int
p = &q
fmt.Println(p)
}
|
登入後複製
4. Go 指標取值
指標取值表示取得指標所保存的位址內的值。以下是使用*
運算子執行指標取值運算的範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main
import (
"fmt"
)
func main() {
var q int = 42
var p *int
p = &q
fmt.Println(p)
fmt.Println(*p)
}
|
登入後複製
5. GoLang 中指標的指標
指標的位址為一個數值,此數值也可以被賦值給其他變數。因此,我們可以創建間接層級。這些間接等級有時會產生不必要的混淆,所以請謹慎使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package main
import (
"fmt"
)
func main() {
i := 64
j := &i
k := &j
fmt.Println(i)
fmt.Println(j)
fmt.Println(*j)
fmt.Println(k)
fmt.Println(*k)
}
|
登入後複製
6. 指向介面的指標
指標可以指向任何東西,甚至可以指向介面。當使用空介面時,傳回的值為 nil。
1 2 3 4 5 6 7 8 9 10 11 12 | package main
import (
"fmt"
)
func main() {
var a interface{}
b := &a
fmt.Println(b)
fmt.Println(*b)
}
|
登入後複製
下面是一個使用有指標介面的範例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package main
import (
"fmt"
)
type Bird interface{
fly()
}
type B struct{
name string
}
func (b B)fly() {
fmt.Println("Flying...")
}
func main() {
var a Bird = B{"Peacock"}
b := &a
fmt.Println(b)
fmt.Println(*b)
}
|
登入後複製
這裡 「a」 是 struct 類型的 Bird,然後用於介面類型,如您所見。這就是多態的使用。 Go 允許使用 介面來實現多態. 因此,您可以看到指向結構或介面的指標是 Go 中必不可少的工具。
7.指標作為函數參數
指標可以在 函數 中作為參數使用。與直接使用值相比,它有一些優勢。使用指標作為參數是將大物件傳遞給函數的一種非常有效的方式。因此,使用它是一個巨大的最佳化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main
import (
"fmt"
)
func f(a *int) {
fmt.Println(*a)
}
func main() {
var a int = 42
f(&a)
}
|
登入後複製
使用大型物件可以減緩執行時間,這是將指標傳遞給結構體的範例。這是處理大物件的有效方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package main
import (
"fmt"
)
type Human struct {
name string
age int
place string
}
func f(h *Human) {
fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)
}
func main() {
john := Human{"John", 36, "Las Vegas"}
f(&john)
}
|
登入後複製
取消引用結構時要小心。如果您使用它像 *structname.field1
那麼它會拋出錯誤。 正確的方法是 (*structname).field1
。
在函數內部使用指標會使值“可變”,除非它的參數為const,因此,每當我們想要改變一個值時,我們應該使用指向該值的指標作為函數參數,然後進行必要的修改。
8. Go 中的「new」函數
Go 中的 new 函數傳回一個指向類型的指標。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main
import (
"fmt"
)
func main() {
ptri := new (int)
*ptri = 67
fmt.Println(ptri)
fmt.Println(*ptri)
}
|
登入後複製
9. 從函數傳回指標
可以像其他值一樣從函數傳回任何類型的指標。這真的很簡單。我們不會直接傳回值,而是傳回該值的位址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main
import (
"fmt"
)
func p() *int {
v := 101
return &v
}
func main() {
n := p()
fmt.Println(n)
fmt.Println(*n)
}
|
登入後複製
10. 指向函數的指標
指向函數的指標在 Go 中是隱式工作的。這意味著我們不需要將其聲明為指標。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main
import (
"fmt"
)
func main() {
f := func() {
fmt.Println("a function ")
}
pf := f
pf()
}
|
登入後複製
11. Go 中使用指標要記住的事項
Go 中不允許進行指標運算。因此,我們不能像在 C/C 中那樣執行一元遞增或遞減之類的操作。
我們可能想要使用指向數組的指針,但是使用切片是一個更好的選擇。切片比指向數組的指標用途廣泛得多。程式碼非常簡潔,讓我們的工作更容易。因此,盡可能使用切片。
更多程式相關知識,請造訪:程式設計影片! !
以上是詳解Go語言中指針的11個知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!