Day11# Pointer

终於跨入第 11 天,今天要来了解在 Go 里面我很不理解的一个型别 -- Pointer。
话不多说,我们就进入正题吧 ─=≡Σ(((っ゚∀゚)っ

Pointer

变数就像一格一格的抽屉,只要在一定的规则内,都能够去更动这个小抽屉里面放的东西。

举例来说有一个 A抽屉,我在里面放了一颗石头,这个石头就会是 A抽屉 内的值。如果我想要 B抽屉 的内容是跟 A抽屉 是一样的,就会去复制他里面的内容放进自己的抽屉,这就是「传值」的概念。

但 Pointer 是指向一个记忆体位址,并不是透过复制相同的值来更改变数。
再拿抽屉当做例子,A抽屉 里面有一支笔,而我让 B抽屉 使用 pointer 的方式让柜子内容指向 A抽屉,虽然看起来 B抽屉A抽屉 的内容会相同,但是当更改 B抽屉 的内容时 A抽屉 也会跟着变动。


简单来说大概是这个概念

pointer 起手式

会以 *type 定义一个 pointer 型态:

var p *int

此时的 p 还不知道会去指向哪个 int 型态的变数记忆体位置,
如果要让 pointer 去指向某个变数,会使用 & 符号。

package main

import "fmt"

func main() {
	var p *int

	i := 42
	p = &i

	fmt.Println(p)
}
// => 0xc00001a170

如果有实际执行看看这段程序码的人,应该就会发现印出来的 p 并不是 i 的值,而是一串很像乱码的东西,那个东西就是指向的 i 变数的记忆体位置。

如果想要得到期望的资讯,需要加上 *,透过 pointer 读取到记忆体的值。

package main

import "fmt"

func main() {
	var p *int

	i := 42
	p = &i

	fmt.Println(*p)
}
// => 42

还记得刚刚提到 B抽屉 如果透过 pointer 的方式修改内容,就会更改到 A抽屉 的值吗?我们来实践看看吧!

package main

import "fmt"

func main() {
	var p *int

	i := 42
	p = &i
	*p = 10

	fmt.Println(i)
}

// => 10

一样在 p 前加上 * 就会是以 pointer 的方式直接去改变记忆体位置的值。这样最後 i 得出来的内容就会是 *p 赋值的 10 了!

结尾

pointer 的介绍差不多就到这边,有任何问题欢迎与我指教 :)
本篇文章同步发布於 我的部落格


<<:  Day 11 - 画布操作与编织复杂图形

>>:  Day 12:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《JoJo的奇妙冒险》第三季 part 2

DAY26 把这个Google maps 放在 APP 上(二)

看到标题有个(二)该不会又是很长的系列文了吧!? 并不会。 因为有点复杂。微懒。 抓取目前所在位子 ...

Day 5【JavaScript】可以看到,将近是20公分的深度

【前言】 我的习惯是先在 Youtube 看完落落长的影片,然後才去 Coursera 看看有什麽...

Day 27 - Kotlin的类别继承和覆写

Day 27 - Kotlin的类别继承和覆写 昨天我们讲完了Kotlin客户端和和服务器端一起使用...

ISO 27001 资讯安全管理系统 【解析】(九)

(一)正式范围定义的目的 范围定义的目的是准确说明组织所做的事情,范围说明应准确说明组织所做的事情是...

[Flutter ] Django 为资料库,以 FutureBuilder + http 抓取

Free fake API 为资料库,以 FutureBuilder + http 抓取 为Flut...