关于Golang 指针理解


本文摘自php中文网,作者藏色散人,侵删。

下面由golang教程栏目给大家介绍关于Golang 指针理解 ,希望对需要的朋友有所帮助!

0x00 指针地址和指针类型

一个变量对应一个保存了变量对应类型值的内存空间,一个指针的值是另一个变量的地址,指针变量可以指向任何一个值的内存地址。

取地址符号 &
在指针类型前加上 * 号,可以获取指针所指向的内容,它是一个类型更改器,使用一个指针引用一个值称为间接引用。

1

prt := &v    // v 的类型为T

v 表示被取地址的变量,prt 接收 v 的地址,prt 的类型为 *T,称为 T 的指针类型。

0x01 从指针获取指针指向的值

使用 & 对变量进行取地址之后,获得这个变量的指针,可以对指针使用 * 号来获取这个指针指向的值,称为指针取值。

1

2

3

temp := "test content"

prt := &temp

fmt.Println(*prt)   // 打印 test content

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

对变量进行取地址(&)操作,可以获得这个变量的指针变量。
指针变量的值是指针地址。
对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

0x02 使用指针修改值

使用 * 对指针指向的值进行修改和操作

1

2

3

4

5

x, y := 1, 2

fmt.Println(x, y)  // 1 2

j, k := &x, &y

*j, *k = *k, *j

fmt.Println(x, y)  // 2 1

* 操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值;当操作在左值时,就是将值设置给指向的变量。

如果只是对引用的指针进行交换,那么对被引用的变量,值和地址都是不会影响,受影响的只是应用的指针。

1

2

3

4

5

6

7

x, y := 1, 2

fmt.Println(x, y)  // 1 2

j, k := &x, &y

j, k = k, j

fmt.Println(x, y)    // 1 2

fmt.Printf("x : %p, y :  %p \n", &x, &y)  // x : 0xc00001a088, y :  0xc00001a090

fmt.Printf("j : %p, y :  %p \n", j, k)  //j : 0xc00001a090, y :  0xc00001a088

x, y 值和地址都不影响,指针j, k 交换之后,j, k 的值交换了。

0x03 返回函数中局部变量

Go语言中,返回函数中局部变量的地址也是安全的,例如下面的代码,调用f函数时创建局部变量v,在局部变量地址被返回之后依然有效,因为指针p依然引用这个变量

1

2

3

4

5

6

var p = f()

 

func f() *int {

    v := 1

    return &v

}

0x04 使用 new() 创建指针

1

2

3

4

temp := new(int)

*temp = 123

fmt.Println(*temp)  // 123

fmt.Println(temp)  //  0xaabb

0x05 flag包的指针技术

指针是实现标准库中flag包的关键技术,它用来实现命令行的标志解析。
例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package main

 

import (

    "flag"

    "fmt"

    "strings"

)

 

var n = flag.Bool("n", true, "print test")

var sep = flag.String("s", " ", "separator")

var test = flag.String("test", " ", "测试")

 

func main() {

    flag.Parse()

    fmt.Println(strings.Join(flag.Args(), *sep))

    if *n {

        fmt.Println(*test)

    }

}

运行

1

2

3

4

5

6

7

8

9

10

11

12

13

$ go run main.go --help

Usage of /var/exe/main:

  -n    print test

  -s string

        separator (default " ")

  -test string

        测试 (default " ")

exit status 2

$ go run main.go -s "+"  --test 测试文本 a bc def 123

a+bc+def+123

$ go run main.go -s "+" -n --test 测试文本 a bc def 123

a+bc+def+123

测试文本

以上就是关于Golang 指针理解的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang怎么判断字符串是否为空

聊聊dubbo-go-proxy的jtypes

手撸golang 行为型设计模式 状态模式

手撸golang 结构型设计模式 桥接模式

go 将数组按指定大小分隔

go入门-1 变量

golang如何打印单引号和双引号

详解怎么实现go超时控制

golang usr/local/go/pkg/tool/linux_amd64/link: fingerprint mismatch 解决办法

golang 创建型设计模式 简单工厂

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...