溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

golang有沒有指針

發(fā)布時間:2022-11-23 11:06:27 來源:億速云 閱讀:144 作者:iii 欄目:編程語言

這篇文章主要介紹了golang有沒有指針的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇golang有沒有指針文章都會有所收獲,下面我們一起來看看吧。

golang有指針。Go語言為程序員提供了控制數(shù)據(jù)結(jié)構(gòu)指針的能力,其對指針的支持介于Java語言和C/C++語言之間,它既沒有像Java那樣取消了代碼對指針的直接操作的能力,也避免了C/C++中由于對指針的濫用而造成的安全和可靠性問題。指針在Go語言中可被拆分為兩個核心概念:1、類型指針,允許對這個指針類型的數(shù)據(jù)進行修改;2、切片,由指向起始元素的原始指針、元素數(shù)量和容量組成。

與 Java 和 .NET 等編程語言不同,Go語言為程序員提供了控制數(shù)據(jù)結(jié)構(gòu)指針的能力,但是,并不能進行指針運算。Go語言允許你控制特定集合的數(shù)據(jù)結(jié)構(gòu)、分配的數(shù)量以及內(nèi)存訪問模式,這對于構(gòu)建運行良好的系統(tǒng)是非常重要的。指針對于性能的影響不言而喻,如果你想要做系統(tǒng)編程、操作系統(tǒng)或者網(wǎng)絡(luò)應(yīng)用,指針更是不可或缺的一部分。

Go語言對指針的支持介于Java語言和C/C++語言之間,它既沒有像Java那樣取消了代碼對指針的直接操作的能力,也避免了C/C++中由于對指針的濫用而造成的安全和可靠性問題。

指針(pointer)在Go語言中可以被拆分為兩個核心概念:

  • 類型指針,允許對這個指針類型的數(shù)據(jù)進行修改,傳遞數(shù)據(jù)可以直接使用指針,而無須拷貝數(shù)據(jù),類型指針不能進行偏移和運算。

  • 切片,由指向起始元素的原始指針、元素數(shù)量和容量組成。

受益于這樣的約束和拆分,Go語言的指針類型變量即擁有指針高效訪問的特點,又不會發(fā)生指針偏移,從而避免了非法修改關(guān)鍵性數(shù)據(jù)的問題。同時,垃圾回收也比較容易對不會發(fā)生偏移的指針進行檢索和回收。

切片比原始指針具備更強大的特性,而且更為安全。切片在發(fā)生越界時,運行時會報出宕機,并打出堆棧,而原始指針只會崩潰。

golang中什么是指針?

指針是一個變量,其值是另一個變量的地址,即存儲器位置的直接地址。類似變量或常量一樣,必須要先聲明一個指針,然后才能使用它來存儲任何變量地址。指針變量聲明的一般形式是:

var var-name *var-type

這里,var-type是指針的基類型; 它必須是有效的Go數(shù)據(jù)類型,var-name是指針變量的名稱。用于聲明指針的星號(*)與用于乘法的星號相同。但是,在此語句中,星號(*)用于將變量指定為指針。以下是有效的指針聲明:

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

所有指針的值的實際數(shù)據(jù)類型(無論是整數(shù),浮點數(shù)還是其他數(shù)據(jù)類型)都是相同的,它表示內(nèi)存地址的長十六進制數(shù)。不同數(shù)據(jù)類型的指針的唯一區(qū)別是指針所指向的是變量或常量的數(shù)據(jù)類型。

如何使用指針?

有幾個重要的操作,將非常頻繁地使用指針來實現(xiàn)。

  • 定義一個指針變量

  • 將一個變量的地址賦值給一個指針

  • 最后訪問指針變量中可用地址的值

這是通過使用一元運算符*來返回位于操作數(shù)指定的地址的變量的值。下面的例子使用這些操作:

package main

import "fmt"

func main() {
   var a int= 20   /* actual variable declaration */
   var ip *int        /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

當(dāng)上面的代碼編譯和執(zhí)行時,它產(chǎn)生結(jié)果如下:

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

在Go語言中的nil指針

Go編譯器為指針變量分配一個Nil值,以防指針沒有確切的地址分配。這是在變量聲明的時候完成的。指定為nil值的指針稱為nil指針。

nil指針是在幾個標準庫中定義的值為零的常量。參考下面的程序:

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

當(dāng)上面的代碼編譯和執(zhí)行時,它產(chǎn)生結(jié)果如下:

The value of ptr is 0

在大多數(shù)操作系統(tǒng)上,程序不允許訪問地址0處的內(nèi)存,因為該內(nèi)存是由操作系統(tǒng)保留的。 然而,存儲器地址0具有特殊意義;它表示指針不打算指向可訪問的存儲器位置。但是按照慣例,如果指針包含nil(零)值,則假設(shè)它不指向任何東西。

要檢查是否為nil指針,可以使用if語句,如下所示:

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

關(guān)于“golang有沒有指針”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“golang有沒有指針”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI