终於跨入第 11 天,今天要来了解在 Go 里面我很不理解的一个型别 -- Pointer。
话不多说,我们就进入正题吧 ─=≡Σ(((っ゚∀゚)っ
变数就像一格一格的抽屉,只要在一定的规则内,都能够去更动这个小抽屉里面放的东西。
举例来说有一个 A抽屉
,我在里面放了一颗石头,这个石头就会是 A抽屉
内的值。如果我想要 B抽屉
的内容是跟 A抽屉
是一样的,就会去复制他里面的内容放进自己的抽屉,这就是「传值」的概念。
但 Pointer 是指向一个记忆体位址,并不是透过复制相同的值来更改变数。
再拿抽屉当做例子,A抽屉
里面有一支笔,而我让 B抽屉
使用 pointer 的方式让柜子内容指向 A抽屉
,虽然看起来 B抽屉
跟 A抽屉
的内容会相同,但是当更改 B抽屉
的内容时 A抽屉
也会跟着变动。
简单来说大概是这个概念
会以 *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 12:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《JoJo的奇妙冒险》第三季 part 2
看到标题有个(二)该不会又是很长的系列文了吧!? 并不会。 因为有点复杂。微懒。 抓取目前所在位子 ...
【前言】 我的习惯是先在 Youtube 看完落落长的影片,然後才去 Coursera 看看有什麽...
Day 27 - Kotlin的类别继承和覆写 昨天我们讲完了Kotlin客户端和和服务器端一起使用...
(一)正式范围定义的目的 范围定义的目的是准确说明组织所做的事情,范围说明应准确说明组织所做的事情是...
Free fake API 为资料库,以 FutureBuilder + http 抓取 为Flut...