0

0

Go Pointer指针是什么?要掌握的知识点有哪些?

藏色散人

藏色散人

发布时间:2021-09-17 16:28:32

|

2566人浏览过

|

来源于learnku

转载

本文由go语言教程栏目给大家介绍go pointer 指针的 11 个知识点,希望对需要的朋友有所帮助!

Go

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

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

Teleporthq
Teleporthq

一体化AI网站生成器,能够快速设计和部署静态网站

下载

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() // 一个函数}

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

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

原文地址:https://golangdocs.com/pointers-in-golang

译文地址:https://learnku.com/go/t/60880

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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