首页 > 后端开发 > Golang > 正文

详解Go语言中指针的11个知识点

青灯夜游
发布: 2022-10-27 19:19:09
转载
3245人浏览过

指针是写出优秀代码最重要的部分之一。在这篇文章中,我们将探索指针是什么,以及如何在 go 中使用它们。

详解Go语言中指针的11个知识点

1. 什么是指针

指针是存储其指向地址的变量(强调一下,只是存储数值的变量)。【相关推荐:Go视频教程

特定类型的指针只能指向该类型(指针指向的数据类型不可变)。

2. GoLang 指针语法

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

var ptr *type
var ptrint *int     // 指向 int 的指针
登录后复制

指针的零值是 nil

立即学习go语言免费学习笔记(深入)”;

3. Go 中指针的初始化

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

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
}
登录后复制

4. Go 指针取值

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

package main

import (
    "fmt"
)

func main() {
    var q int = 42
    var p *int
    p = &q
    fmt.Println(p)  // 0x40e020
    fmt.Println(*p) // 42
}
登录后复制

5. GoLang 中指针的指针

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

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)
}
登录后复制

6. 指向接口的指针

指针可以指向任何东西,甚至可以指向接口。当使用空接口时,返回的值为 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 中必不可少的工具。

钉钉 AI 助理
钉钉 AI 助理

钉钉AI助理汇集了钉钉AI产品能力,帮助企业迈入智能新时代。

钉钉 AI 助理 204
查看详情 钉钉 AI 助理

7. 指针作为函数参数

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

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

8. Go 中的「new」函数

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

package main

import (
    "fmt"
)

func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67
}
登录后复制

9. 从函数返回指针

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

package main

import (
    "fmt"
)

func p() *int {  // 将返回类型指定为指针
    v := 101

    // 返回地址
    return &v
}

func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101
}
登录后复制

10. 指向函数的指针

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

package main

import (
    "fmt"
)

func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f
    pf() // 一个函数
}
登录后复制

11. Go 中使用指针要记住的事项

Go 中不允许进行指针运算。因此,我们不能像在 C/C++ 中那样执行一元递增或递减之类的操作。
我们可能希望使用指向数组的指针,但是使用切片是一个更好的选择。切片比指向数组的指针用途广泛得多。代码非常简洁,让我们的工作更加容易。因此,尽可能使用切片。

更多编程相关知识,请访问:编程视频!!

以上就是详解Go语言中指针的11个知识点的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:learnku网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号