Go從入門到精通 指標

2022-09-20 10:27:08 字數 2248 閱讀 8168

指標概念在 go 語言中被拆分成為兩個核心概念:

c/c++中指標飽受詬病的根本原因是指標運算和記憶體釋放。

c/c++ 語言中的裸指標可以自由偏移、甚至可以在某些情況下偏移進入作業系統核心區域。我們計算機作業系統經常需要更新、修復漏洞的本質,是為解決指標越界訪問所導致的 "

緩衝區溢位

"同時指標又是c/c++語言有極高效能的根本,在操作大塊資料和做偏移時方便又快捷。因此作業系統依然使用 c 語言及指標特性進行編寫。

受益於這樣的約束和拆分,go 語言的指標型別變數擁有指標的高效訪問,但又不會發生指標偏移,從而避免非法修改關鍵性資料問題。同時,垃圾**也比較容易對不會發生偏移的指標進行檢索和**。切片比原始指標具備更強大的特性,更為安全。切片發生越界時,執行時會報出宕機,並打出堆疊,而原始指標只會崩潰。每個變數在執行時都擁有乙個位址,這個位址代表變數在記憶體中的位置。go 語言中使用 "&" 操作符放在變數前面對變數進行 "取位址" 操作。

格式如下:

ptr := &v      //

v 的型別為 t

其中 v 代表被取位址的變數,被取位址的 v 使用 ptr 變數進行接收,ptr 的型別就為 *t,稱做 t 的指標型別。* 代表指標。

指標實際用法,通過下面的例子了解:

package main

import "fmt"

func main()

**說明如下:

在對普通變數使用 " & " 操作符取位址獲得這個變數的指標後,可以對指標使用 " * " 操作,也就是指標取值,**如下:

package main

import(

"fmt"

)func main()

**輸出如下:

取位址操作符 " & ",和取值操作符 " * ",是一對互補操作符。

& 取出位址,* 根據位址取出位址指向的值。

變數、指標位址、指標變數、取位址、取值的相互關係和特性如下:

通過指標不僅可以取值,也可以修改值。

下面我們使用多重複製的方法進行數值交換,使用指標同樣可以進行數值交換,**如下:

package main 

import(

"fmt"

)// 交換函式

func swap(a,b *int)

func main()

**輸出如下: 

如果在 swap() 函式交換操作的是指標值,會發生什麼情況呢?

package main 

import(

"fmt"

)// 交換函式

func swap(a,b *int)

func main()

**輸出如下:

結果表明,交換是不成功的。上面**中的 swap() 函式交換的是 a 和 b 的位址,在交換完畢後,a 和 b 的變數值確實被交換。但和 a, b 關聯的連個變數病沒有實際關聯。

這就好比。有兩封信件放在桌子上一字攤開,交換兩封信件後,並不會對兩封信件裡面有任何影響。

go 語言還提供了另外一種方法來建立指標變數,格式如下:

new()
一般這樣寫:

str := new(string)

*str = "nanjing"

fmt.println(*str)

new() 函式可以建立乙個對應型別的指標,建立過程會分配記憶體。被建立的指標指向的值為預設值(對應資料型別的零值)。

package main

import (

"fmt"

)func main()

**輸出如下:

C語言 指標 從入門到精通

最近在老師在講資料結構,然後發現自己的c指標內容好多都遺忘了,在此做了個總結,趁機鞏固下c語言的知識。基本知識點歸納 指標就是位址,位址就是指標。指標變數就是存放位址的變數。如果乙個指標變數指向乙個普通變數,則 指標變數 就完全等普通變數。位址就是記憶體單元的編號。指標變數就是存放位址的變數 指標是...

Go語言從入門到精通 字元型別

字串中的每乙個元素叫做 字元 在遍歷或者單個獲取字串元素時可以獲得字元。go 語言的字元有以下兩種 使用 fmt.printf 中的 t動詞可以輸出變數的實際型別,使用這個方法可以檢視 byte 和 rune 的本來型別,如下 var a byte a fmt.printf d t n a,a va...

Go語言從入門到精通 匿名變數

在使用多重賦值時,如果不需要在左值中接收變數,可以使用匿名變數 anonymous variable 匿名變數的表現是乙個下畫線 使用匿名變數時,只需要在變數宣告的地方使用下畫線替換即可。例如 func getdata int,int a,getdata b getdata fmt.println ...