iT邦幫忙

2023 iThome 鐵人賽

DAY 1
1
自我挑戰組

Go語言自學挑戰系列 第 14

第十四天:Golang 指標Pointer

  • 分享至 

  • xImage
  •  

指標介紹

筆者第一個學習的程式語言是C++,當時學得很開心~

/images/emoticon/emoticon07.gif

但......碰到指標之後一個頭兩個大,當時完全搞不懂指標到你在幹嘛......

/images/emoticon/emoticon06.gif

如果你是跟我一樣對指標很困擾的朋友,一起透過本文來重新學習吧~

什麼是指標?

指標簡單來說就是儲存變數的記憶體位置

宣告變數時電腦會配置一個記憶體位置給它,

指標就是取得變數的記憶體位。

開始練習指標

宣告指標的方法

指標的宣告方式為:var 指標名稱 *型態、指標取得值的方法:*指標名稱

實際範例如下:

package main

import "fmt"

func main() {
	var num int = 1 //宣告一個變數num
	var pt *int     //宣告一個指標
	pt = &num       //取得num的記憶體位置

	fmt.Println("num的位置", pt)
	fmt.Println("num的值", *pt)
}

輸出結果如下:

num的位置 0xc0000a2000
num的值 1

透過指標異動變數的值

由於指標是直接取得變數記憶體的位置,

所以當我們修改指標的值,同時也是在修改變數的值,

程式的範例如下:

package main

import "fmt"

func main() {
	var num int = 1 //宣告一個變數num

	var pt *int //宣告一個指標

	pt = &num //取得num的記憶體位置

	fmt.Println("num的位置", pt)
	fmt.Println("num的值", *pt)

	// 透過指標可直接更動變數num的值
	*pt = 2
	fmt.Println("num的值", *pt)
	fmt.Println("num的值", num)

	//
}

輸出結果如下:

num的位置 0xc0000a2000
num的值 1
num的值 2
num的值 2

指標的應用

下範例練習使用指標做為參數的函式,

透過指標可以減少記憶體空間重複使用直接取得變數值,

範例如下:

package main

import "fmt"

// 函式的參數為指標
func test(pt *int) {
	*pt = 3
}

func main() {
	var num int = 1 //宣告一個變數num

	var pt *int //宣告一個指標

	pt = &num //取得num的記憶體位置

	fmt.Println("num的位置", pt)
	fmt.Println("num的值", *pt)

	//函式的引數為指標
	test(pt)
	fmt.Println("num的值", *pt)

}

輸出結果:

num的位置 0xc000090000
num的值 1
num的值 3

結語

本為雖然沒有探討的很深入,

但是透過本次練習又複習了一次指標~

覺得開心

/images/emoticon/emoticon08.gif

參考資料

  1. https://opensourcedoc.com/golang-programming/pointer/
  2. https://ithelp.ithome.com.tw/articles/10235479

上一篇
第十三天:Map介紹
下一篇
第十五天:Method 介紹
系列文
Go語言自學挑戰29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
obarisk
iT邦研究生 1 級 ‧ 2023-09-15 08:32:32

golang 能不用指標就不用指標

G米 iT邦新手 4 級 ‧ 2023-09-16 08:58:40 檢舉

謝謝分享~~
不好意思,想請問一下為何不建議使用指標~

obarisk iT邦研究生 1 級 ‧ 2023-09-16 23:23:10 檢舉

記憶體管理的成本太高.

只有在少數狀況才會建議用指標
比如
boolean指標: true/false/nil
或是物件真的很大的時間(記憶體管理的成本小於物件複制時)

G米 iT邦新手 4 級 ‧ 2023-09-18 08:29:29 檢舉

謝謝~~~
學到很重要的觀念了!!

我要留言

立即登入留言