千家信息网

Go Pointer指针是什么

发表于:2024-10-04 作者:千家信息网编辑
千家信息网最后更新 2024年10月04日,这篇文章主要讲解了"Go Pointer指针是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Go Pointer指针是什么"吧!1. 什么是指针?
千家信息网最后更新 2024年10月04日Go Pointer指针是什么

这篇文章主要讲解了"Go Pointer指针是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Go Pointer指针是什么"吧!

1. 什么是指针?

指针是存储其指向地址的变量。特定类型的指针只能指向该类型(数据类型不可变)。

2. GoLang 指针语法

指针的语法非常简单。以下是 Go 中指针声明的语法。

var ptr *typevar ptrint *int     // 指向 int 的指针

指针的零值是 nil

3. Go 中指针的初始化

类型的指针使用 & 对其进行初始化:

package mainimport (    "fmt")func main() {    var q int = 42    var p *int     // declare the pointer    p = &q         // initialize the pointer    fmt.Println(p)  // 0x40e020}

4. Go 指针取值

指针取值意味着获取指针保存的地址内的值。下面是使用 * 运算符执行指针取值操作的示例:

package mainimport (    "fmt")func main() {    var q int = 42    var p *int    p = &q    fmt.Println(p)  // 0x40e020    fmt.Println(*p) // 42}

5. GoLang 中指针的指针

指针的地址为一个数值,此数值也可以被赋值给其他变量。因此,我们可以创建间接级别。这些间接级别有时会产生不必要的混淆,所以请谨慎使用。

package mainimport (    "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)}

6. 指向接口的指针

指针可以指向任何东西,甚至可以指向接口。当使用空接口时,返回的值为 nil

package mainimport (    "fmt")func main() {       var a interface{}    b := &a    fmt.Println(b)    // 0x40c138    fmt.Println(*b)   // }

下面是一个使用带有指针接口的例子。

package mainimport (    "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 中必不可少的工具。

7. 指针作为函数参数

指针可以在 函数 中作为参数使用。与直接使用值相比,它有一些优势。使用指针作为参数是将大对象传递给函数的一种非常有效的方式。因此,使用它是一个巨大的优化。

package mainimport (    "fmt")//声明指针参数func f(a *int) {    fmt.Println(*a)}func main() {       var a int = 42    // 传递地址    f(&a) // 42}

使用大型对象可以减缓执行时间,这是将指针传递给结构体的示例。这是处理大对象的有效方法。

package mainimport (    "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,因此,每当我们想要更改一个值时,我们应该使用指向该值的指针作为函数参数,然后进行必要的修改。

8. Go 中的「new」函数

Go 中的 new 函数返回一个指向类型的指针。

package mainimport (    "fmt")func main() {       ptri := new(int)    *ptri = 67    fmt.Println(ptri)  // 0x40e020    fmt.Println(*ptri) // 67}

9. 从函数返回指针

可以像其他值一样从函数返回任何类型的指针。这真的很简单。我们不直接返回值,而是返回该值的地址。

package mainimport (    "fmt")func p() *int {  // 将返回类型指定为指针    v := 101    // 返回地址    return &v}func main() {       n := p()    fmt.Println(n)  // 0x40e020    fmt.Println(*n) // 101}

10. 指向函数的指针

指向函数的指针在 Go 中是隐式工作的。这意味着我们不需要将其声明为指针。

package mainimport (    "fmt")func main() {           f := func() {        fmt.Println("a function")       }    pf := f    pf() // 一个函数}

感谢各位的阅读,以上就是"Go Pointer指针是什么"的内容了,经过本文的学习后,相信大家对Go Pointer指针是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0