您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語言中指針的知識點有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
指針是存儲其指向地址的變量(強調一下,只是存儲數值的變量)。
特定類型的指針只能指向該類型(指針指向的數據類型不可變)。
指針的語法非常簡單。以下是 Go 中指針聲明的語法。
var ptr *type
var ptrint *int // 指向 int 的指針
指針的零值是 nil。
類型的指針使用 &
對其進行初始化:
package main
import (
"fmt"
)
func main() {
var q int = 42
var p *int // declare the pointer
p = &q // initialize the pointer
fmt.Println(p) // 0x40e020
}
指針取值意味著獲取指針保存的地址內的值。下面是使用 *
運算符執行指針取值操作的示例:
package main
import (
"fmt"
)
func main() {
var q int = 42
var p *int
p = &q
fmt.Println(p) // 0x40e020
fmt.Println(*p) // 42
}
指針的地址為一個數值,此數值也可以被賦值給其他變量。因此,我們可以創建間接級別。這些間接級別有時會產生不必要的混淆,所以請謹慎使用。
package main
import (
"fmt"
)
func main() {
i := 64
j := &i // j 是 int 類型的指針
k := &j // k 是存放指針地址的指針,也是 int 類型
fmt.Println(i) // 64
fmt.Println(j) // 0x40e020
fmt.Println(*j) // 64 (value inside that address)
fmt.Println(k) // 0x40c138
fmt.Println(*k) // 0x40e020 (address of j)
}
指針可以指向任何東西,甚至可以指向接口。當使用空接口時,返回的值為 nil。
package main
import (
"fmt"
)
func main() {
var a interface{}
b := &a
fmt.Println(b) // 0x40c138
fmt.Println(*b) // <nil>
}
下面是一個使用帶有指針接口的例子。
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) // 0x40c138
fmt.Println(*b) // {Peacock}
}
這里 “a” 是一個 struct 類型的 Bird,然后用于接口類型,如您所見。這就是多態的使用。Go 允許使用 接口來實現多態. 因此,您可以看到指向結構或接口的指針是 Go 中必不可少的工具。
指針可以在 函數 中作為參數使用。與直接使用值相比,它有一些優勢。使用指針作為參數是將大對象傳遞給函數的一種非常有效的方式。因此,使用它是一個巨大的優化。
package main
import (
"fmt"
)
//聲明指針參數
func f(a *int) {
fmt.Println(*a)
}
func main() {
var a int = 42
// 傳遞地址
f(&a) // 42
}
使用大型對象可以減緩執行時間,這是將指針傳遞給結構體的示例。這是處理大對象的有效方法。
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) // The user John is 36 years old and he is from Las Vegas
}
取消引用結構時要小心。如果您使用它像 *structname.field1
那么它會拋出錯誤。 正確的方法是 (*structname).field1
。
在函數內部使用指針會使值「可變」,除非它的參數為 const,因此,每當我們想要更改一個值時,我們應該使用指向該值的指針作為函數參數,然后進行必要的修改。
Go 中的 new 函數返回一個指向類型的指針。
package main
import (
"fmt"
)
func main() {
ptri := new(int)
*ptri = 67
fmt.Println(ptri) // 0x40e020
fmt.Println(*ptri) // 67
}
可以像其他值一樣從函數返回任何類型的指針。這真的很簡單。我們不直接返回值,而是返回該值的地址。
package main
import (
"fmt"
)
func p() *int { // 將返回類型指定為指針
v := 101
// 返回地址
return &v
}
func main() {
n := p()
fmt.Println(n) // 0x40e020
fmt.Println(*n) // 101
}
指向函數的指針在 Go 中是隱式工作的。這意味著我們不需要將其聲明為指針。
package main
import (
"fmt"
)
func main() {
f := func() {
fmt.Println("a function")
}
pf := f
pf() // 一個函數
}
Go 中不允許進行指針運算。因此,我們不能像在 C/C++ 中那樣執行一元遞增或遞減之類的操作。
我們可能希望使用指向數組的指針,但是使用切片是一個更好的選擇。切片比指向數組的指針用途廣泛得多。代碼非常簡潔,讓我們的工作更加容易。因此,盡可能使用切片。
以上就是“Go語言中指針的知識點有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。