go指針詳解

1、指針的概念

內存是什麼?
我們在編程的時候,實際上就是在操作內存,除非是進行IO操作寫磁盤,否則都是在內存中增刪改查
計算機的內存,就是一系列有序列號的存儲單元,好比一家酒店,有一個接一個的按序排列的房子,
房間裏的東西,就是內存裏存儲的值
那麼在內存中,如何快速尋找一個值?答案是地址,只有用地址訪問是最快的
可是屋子太多了,多到很容易記錯地址,比如我想找喫飯的地方,地址是XX酒店XX樓XX號房間
地址太長可能導致記憶困難、操作失誤等等(類似於ip地址),所以現代的編程語言對於用戶隱藏了操作內存的細節,衍生出了變量的概念
變量是什麼?
變量是一個代表內存地址的字母數字組合、也可以是一個標籤或者一個暱稱,用於引用計算機的內存地址。比如:餐廳(XX酒店XX樓XX號房間),我如果想找喫飯的地方,不需要記下來詳細地址了,直接找餐廳就可以了,餐廳就代表了XX酒店XX樓XX號房間
指針是什麼
指針也是變量,它的值是另一個變量的內存地址,比如餐廳的指針(XX酒店XX樓XX號房間)

2、指針的作用

指針使用
第一,當作爲方法的receiver時,如果你的方法會改變receiver時,必須傳遞指針…
在Go語言中,默認是按值傳遞.當一個變量當作參數傳遞的時候,會創建一個變量的副本, 然後傳遞給函數或者方法,對該副本的操作不會影響到原始變量
當變量當做指針被傳遞的時候,一個新的指針被創建,它是原始變量指針的副本,和原始指針指向同樣的內存地址, 對該指針的操作會影響到原始變量

package main

import "fmt"

func main() {
//  &取地址符 例如:{指針}:=&{變量}
//  *取值符 例如:{變量}:=*{指針}

    var ptr *string // 聲明指針 初始值爲nil
	a := 1
	b := 2
	swap(a, b) // 值傳遞
	fmt.Println(a, ",", b) // 輸出1,2
	swapPoint(&a, &b) // 指針傳遞 使用&獲取變量地址
	fmt.Println(a, ",", b) // 輸出 2,1
	// 空指針判斷
	if(ptr != nil)    /* ptr 不是空指針 */
    if(ptr == nil)    /* ptr 是空指針 */
}

func swap(a, b int) {
	t := a
	a = b
	b = t
}

func swapPoint(a, b *int) {
	t := *a // 獲取a指針指向的變量 賦給t
	*a = *b // 將b指針指向的變量的值 賦給 a指針指向的變量
	*b = t  // 將t的值 賦給b指針指向的變量
}

第二,作爲入參時,golang是值拷貝傳遞, 如果是比較大的struct作爲參數,那麼顯然拷貝一個指針比拷貝整個結構代價要小一些,節省內存

空指針
指針變量通常縮寫爲 ptr(Pointer),當一個指針被定義後沒有分配到任何變量時,它的值爲 nil。
nil 指針也稱爲空指針,對空指針不能進行讀取操作,會拋空指針異常
nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值

總結

指針是一個特殊的變量,它裏面存儲的是另一個變量的內存地址,&操作符獲取變量地址,*操作符獲取指針指向的變量的值
只聲明未賦值的指針,默認值爲nil 沒有分配內存 不可取值
函數方法的接受者,是指針變量時候,指針會被拷貝傳入方法中,拷貝的指針,其指向的地方與原有指針一樣,所以可以修改原始變量

文章引用:https://www.jianshu.com/p/61b1a958e3ab
文章引用:https://zhuanlan.zhihu.com/p/80261614

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章