Go 指针相关

微信扫一扫,分享到朋友圈

Go 指针相关

Go指针

Go
语言中的指针非常简单,没有偏移和运算,只需要记住两个符号。 &
取变量地址与 *
根据地址取值。

以下是一个简单的示例:

package main
import (
"fmt"
)
func main() {
var arr = [3]string{"一", "二", "三"}
var addArr = &arr
fmt.Printf("%p \n",addArr) // 打印地址 0xc000062330
fmt.Printf("%v \n",*addArr) // 根据地址打印值
}

指针类型

当我们使用 &
取出一个变量的内存地址时,可以通过 %T
查看其指针类型。

Go
语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如: *int
*int64
*string
等。

package main
import (
"fmt"
)
func main() {
var a int = 100
fmt.Printf("%T",&a) // *int
}

指针变量

以下示例中声明了一个指针变量,但是该指针指向的内存地址还没有被 Go
进行分配,赋值会引发异常。

package main
import (
"fmt"
)
func main() {
var a *int
*a = 100
fmt.Println(*a)
// +0x2a exit status 2
}

new

new()
是一个内置的函数,用于对一个指针变量开辟内存空间。 为了解决上面内存空间未被开辟的问题,可以使用该函数进行开辟。

注意,实际开发中 new
用的并不多。

package main
import (
"fmt"
)
func main() {
var a *int
a = new(int) // 开辟内存
*a = 100
fmt.Println(*a)
}

make

make()
new()
相同,都是进行内存空间开辟的,但是它只针对 slice
map
chan
的内存创建,并且它返回的值是这三个类型的本身,这三种类型不是属于值类型,而是属于引用类型,故我们可以不使用变量对其进行接收。

注意,在声明上述三种类型时,都需要使用 make
进行内存创建。

package main
import (
"fmt"
)
func main() {
var b map[string]string
b = make(map[string]string, 10)
b["first"] = "第一个元素"
fmt.Println(b["first"])
}

本章小结

指针取值与指针地址

取地址操作符 &
和取值操作符 *
是一对互补操作符, &
取出地址, *
根据地址取出地址指向的值。

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

  • &
    *
    

new与make的区别

    1. 二者都是用来做内存分配的。
    2. make
      只用于 slice
      map
      以及 channel
      的初始化,返回的还是这三个引用类型本身;
    3. new
      用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

微信扫一扫,分享到朋友圈

Go 指针相关

新希望:制药公司Regeneron公布新冠单克隆药物试验结果

上一篇

Nginx+Gunicorn+Supervisor部署Flask应用

下一篇

你也可能喜欢

Go 指针相关

长按储存图像,分享给朋友