中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

設計圖的網(wǎng)站seo哪家強

設計圖的網(wǎng)站,seo哪家強,wordpress網(wǎng)站排名,個人網(wǎng)站的基本風格Go語言中的指針 文章目錄 Go語言中的指針一、Go語言中的指針介紹1.1 指針介紹1.2 基本語法1.3 聲明和初始化1.4 Go 指針的3個重要概念1.4.1 指針地址(Pointer Address)1.4.2 指針類型(Pointer Type)1.4.3 指針取值(Poi…

Go語言中的指針

文章目錄

  • Go語言中的指針
    • 一、Go語言中的指針介紹
      • 1.1 指針介紹
      • 1.2 基本語法
      • 1.3 聲明和初始化
      • 1.4 Go 指針的3個重要概念
        • 1.4.1 指針地址(Pointer Address)
        • 1.4.2 指針類型(Pointer Type)
        • 1.4.3 指針取值(Pointer Dereferencing)
      • 1.5 獲取指針的地址和解引用
      • 1.6 傳遞指針給函數(shù)
      • 1.7 指針的比較
      • 1.8 指針的使用注意事項
    • 二、空指針和指針的零值
    • 三、指針的應用場景
      • 3.1 傳遞大對象
      • 3.2 指針作為函數(shù)參數(shù)和修改函數(shù)外部變量
      • 3.3 動態(tài)分配內(nèi)存
      • 3.4 函數(shù)返回指針
    • 四、new和make
      • 4.1 new
      • 4.2 make
      • 4.3 new與make的區(qū)別

一、Go語言中的指針介紹

1.1 指針介紹

指針是一個存儲變量內(nèi)存地址的變量。它們允許程序直接訪問和操作內(nèi)存中的數(shù)據(jù),而不是對數(shù)據(jù)的副本進行操作。以下是指針的一些關鍵概念:

  • 內(nèi)存地址: 每個變量在計算機內(nèi)存中都有一個唯一的地址,指針存儲了這個地址。
  • 指針變量: 用于存儲其他變量地址的變量稱為指針變量。
  • 取地址操作符(&): 可以使用取地址操作符&來獲取變量的地址。
  • 解引用操作符(*): 可以使用解引用操作符*來訪問指針所指向的變量的值。

Go語言中的值類型(int、float、bool、string、array、struct)都有對應的指針類型,如:*int、*int64、*string等。

1.2 基本語法

  • var ptr *int: 聲明指針變量ptr,用于指向一個int類型變量的地址。
  • &a: 獲取變量a的內(nèi)存地址,返回一個指向該地址的指針。
  • *ptr: 讀取ptr指針指向地址的值,這個操作稱為“解引用”。
  • *ptr = 100: 將100賦值給ptr指向的變量。

1.3 聲明和初始化

在 Go 語言中,可以使用指針來引用任何類型的變量。指針的聲明和初始化可以通過如下語法完成:

var p *int  // 聲明一個指向 int 類型的指針 p
var str *string  // 聲明一個指向 string 類型的指針 str

初始化指針可以通過 new 函數(shù)來分配內(nèi)存并返回指針的地址:

p := new(int)  // 分配一個 int 類型的內(nèi)存,并將指針 p 指向該內(nèi)存

示例代碼:

package mainimport "fmt"func main() {var p *intvar str *stringfmt.Printf("p: %v, str: %v\n", p, str) // 輸出 p: <nil>, str: <nil>x := 10p = &x // 將指針p指向變量x的地址fmt.Printf("p: %v\n", p)   // 輸出 p: 0xc0000100e0fmt.Printf("*p: %d\n", *p) // 輸出 *p: 10str = new(string) // 分配一個string類型的內(nèi)存,并將指針str指向該內(nèi)存fmt.Printf("str: %v\n", str)   // 輸出 str: 0xc000010120fmt.Printf("*str: %s\n", *str) // 輸出 *str: ""*str = "Hello, Go!" // 通過指針修改字符串的值fmt.Printf("*str: %s\n", *str) // 輸出 *str: Hello, Go!}

1.4 Go 指針的3個重要概念

1.4.1 指針地址(Pointer Address)
  • 在Go語言中,指針地址表示指針所指向的變量或數(shù)據(jù)在內(nèi)存中的位置。
  • 在Go語言中,與C/C++等語言不同,您不能直接獲取指針的具體地址值,因為Go語言為了安全性和內(nèi)存管理而采用了更抽象的設計。但是,您可以通過獲取變量的地址來創(chuàng)建和使用指針,而這個地址由Go語言自動管理。
1.4.2 指針類型(Pointer Type)
  • Go語言的指針類型表示指針可以指向的數(shù)據(jù)類型
1.4.3 指針取值(Pointer Dereferencing)
  • 指針取值是指通過指針來訪問其所指向的內(nèi)存位置上的數(shù)據(jù)。在Go語言中,要獲取指針所指向的數(shù)據(jù)的值,您需要使用解引用操作符 *

1.5 獲取指針的地址和解引用

通過 & 操作符可以獲取變量的地址,例如:

func main() {a := 10b := &a  // 將指針 b 指向變量 a 的地址fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*intfmt.Println(&b)                    // 0xc00000e018
}

我們來看一下b := &a的圖示:取變量地址圖示

使用*操作符可以解引用指針,獲取指針指向的值:

 fmt.Println(*b)  // 輸出指針 b 指向的值,即變量 a 的值

示例代碼:

func main() {//指針取值a := 10b := &a // 取變量a的地址,將指針保存到b中fmt.Printf("type of b:%T\n", b)c := *b // 指針取值(根據(jù)指針去內(nèi)存取值)fmt.Printf("type of c:%T\n", c)fmt.Printf("value of c:%v\n", c)
}

輸出如下:

type of b:*int
type of c:int
value of c:10

總結: 取地址操作符&和取值操作符*是一對互補操作符,&取出地址,*根據(jù)地址取出地址指向的值。

變量、指針地址、指針變量、取地址、取值的相互關系和特性如下:

  • 對變量進行取地址(&)操作,可以獲得這個變量的指針變量。
  • 指針變量的值是指針地址。
  • 對指針變量進行取值(*)操作,可以獲得指針變量指向的原變量的值。

1.6 傳遞指針給函數(shù)

您可以將指針作為參數(shù)傳遞給函數(shù),從而可以在函數(shù)內(nèi)部修改原始變量的值,而不是復制。這可以用于實現(xiàn)函數(shù)的副作用。

func modify1(x int) {x = 100
}func modify2(x *int) {*x = 100
}func main() {a := 10modify1(a)fmt.Println(a) // 10modify2(&a)fmt.Println(a) // 100
}

1.7 指針的比較

您可以使用==!=運算符來比較指針。它們將比較指針是否引用相同的內(nèi)存地址。

var x int = 42
var p *int  // 聲明一個整數(shù)指針
p = &x      // 將變量x的地址分配給指針p
fmt.Println(p == &x) // true,p和&x都指向相同的內(nèi)存地址

1.8 指針的使用注意事項

  • 謹慎使用指針,以避免懸掛指針(dangling pointers)和內(nèi)存泄漏等問題。
  • 在Go中,指針通常用于傳遞大型數(shù)據(jù)結構,以避免復制數(shù)據(jù)。
  • Go沒有指針運算(如C/C++中的指針算術運算),因此您不能像C/C++那樣執(zhí)行指針加法和減法操作。

二、空指針和指針的零值

  • **指針的零值:**如果您聲明了一個指針但沒有初始化它,它將具有零值,即nil。
  • **空指針:**如果指針沒有指向任何有效的內(nèi)存地址,它將具有nil值,表示空指針。在使用指針之前,通常會檢查指針是否為nil。
package mainimport "fmt"func main() {var p *stringfmt.Println(p)fmt.Printf("p的值是%s/n", p)if p != nil {fmt.Println("非空")} else {fmt.Println("空值")}
}

三、指針的應用場景

3.1 傳遞大對象

在函數(shù)參數(shù)傳遞時,如果直接傳遞大對象的副本,會產(chǎn)生額外的內(nèi)存開銷。通過傳遞指針,可以避免復制整個對象,提高程序的性能。

示例代碼:

 package mainimport "fmt"type BigObject struct {// 大對象的定義...}func processObject(obj *BigObject) {// 對大對象進行處理...}func main() {obj := BigObject{}processObject(&obj) // 傳遞大對象的指針}

3.2 指針作為函數(shù)參數(shù)和修改函數(shù)外部變量

在 Go 語言中,函數(shù)的參數(shù)傳遞默認是值傳遞。通過指針傳遞,函數(shù)可以修改函數(shù)外部的變量。這在需要修改外部變量的值時非常有用,特別是在處理復雜數(shù)據(jù)結構或需要對全局狀態(tài)進行修改的情況下。

示例代碼:

 package mainimport "fmt"func modifyValue(ptr *int) {*ptr = 30 // 修改指針指向的值}func main() {x := 10modifyValue(&x) // 傳遞x的地址給modifyValue函數(shù)fmt.Println(x) // 輸出修改后的x的值,即30}

3.3 動態(tài)分配內(nèi)存

指針的另一個重要應用是動態(tài)分配內(nèi)存。通過 new 函數(shù)可以在堆上動態(tài)分配內(nèi)存,避免了在棧上分配固定大小的內(nèi)存空間的限制。這對于需要返回動態(tài)分配的數(shù)據(jù)或創(chuàng)建復雜數(shù)據(jù)結構非常有用。

示例代碼:

 package mainimport "fmt"type ComplexStruct struct {// 復雜數(shù)據(jù)結構的定義...}func createComplexStruct() *ComplexStruct {cs := new(ComplexStruct) // 動態(tài)分配內(nèi)存并返回指針// 初始化復雜數(shù)據(jù)結構...return cs}func main() {obj := createComplexStruct()// 對動態(tài)分配的數(shù)據(jù)結構進行操作...}

3.4 函數(shù)返回指針

在函數(shù)中返回指針可以將函數(shù)內(nèi)部創(chuàng)建的變量的地址傳遞給調(diào)用者。這樣做可以避免復制整個變量,并允許調(diào)用者直接訪問和修改函數(shù)內(nèi)部的數(shù)據(jù)。

示例代碼:

 package mainimport "fmt"func createValue() *int {x := 10 // 在函數(shù)內(nèi)部創(chuàng)建變量return &x // 返回變量的地址}func main() {p := createValue()fmt.Println(*p) // 輸出通過指針訪問的函數(shù)內(nèi)部變量的值,即10}

四、new和make

我們先來看一個例子:

func main() {var a *int*a = 100fmt.Println(*a)var b map[string]intb["測試"] = 100fmt.Println(b)
}

執(zhí)行上面的代碼會引發(fā)panic,為什么呢? 在Go語言中對于引用類型的變量,我們在使用的時候不僅要聲明它,還要為它分配內(nèi)存空間,否則我們的值就沒辦法存儲。而對于值類型的聲明不需要分配內(nèi)存空間,是因為它們在聲明的時候已經(jīng)默認分配好了內(nèi)存空間。要分配內(nèi)存,就引出來今天的new和make。 Go語言中new和make是內(nèi)建的兩個函數(shù),主要用來分配內(nèi)存。

4.1 new

new是一個內(nèi)置的函數(shù),它的函數(shù)簽名如下:

func new(Type) *Type

其中,

  • Type表示類型,new函數(shù)只接受一個參數(shù),這個參數(shù)是一個類型
  • *Type表示類型指針,new函數(shù)返回一個指向該類型內(nèi)存地址的指針。

new函數(shù)不太常用,使用new函數(shù)得到的是一個類型的指針,并且該指針對應的值為該類型的零值。舉個例子:

func main() {a := new(int)b := new(bool)fmt.Printf("%T\n", a) // *intfmt.Printf("%T\n", b) // *boolfmt.Println(*a)       // 0fmt.Println(*b)       // false
}	

本節(jié)開始的示例代碼中var a *int只是聲明了一個指針變量a但是沒有初始化,指針作為引用類型需要初始化后才會擁有內(nèi)存空間,才可以給它賦值。應該按照如下方式使用內(nèi)置的new函數(shù)對a進行初始化之后就可以正常對其賦值了:

func main() {var a *inta = new(int)*a = 10fmt.Println(*a)
}

4.2 make

make也是用于內(nèi)存分配的,區(qū)別于new,它只用于slice、map以及channel的內(nèi)存創(chuàng)建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。make函數(shù)的函數(shù)簽名如下:

func make(t Type, size ...IntegerType) Type

make函數(shù)是無可替代的,我們在使用slice、map以及channel的時候,都需要使用make進行初始化,然后才可以對它們進行操作。這個我們在上一章中都有說明,關于channel我們會在后續(xù)的章節(jié)詳細說明。

本節(jié)開始的示例中var b map[string]int只是聲明變量b是一個map類型的變量,需要像下面的示例代碼一樣使用make函數(shù)進行初始化操作之后,才能對其進行鍵值對賦值:

func main() {var b map[string]intb = make(map[string]int, 10)b["測試"] = 100fmt.Println(b)
}

4.3 new與make的區(qū)別

  1. 二者都是用來做內(nèi)存分配的。
  2. make只用于slice、map以及channel的初始化,返回的還是這三個引用類型本身;
  3. 而new用于類型的內(nèi)存分配,并且內(nèi)存對應的值為類型零值,返回的是指向類型的指針。
http://www.risenshineclean.com/news/50322.html

相關文章:

  • 南寧學網(wǎng)站建設自助發(fā)外鏈網(wǎng)站
  • 網(wǎng)站關鍵字優(yōu)化軟件免費關鍵詞排名優(yōu)化軟件
  • 做網(wǎng)站前段用什么軟件百度seo排名培訓 優(yōu)化
  • 做網(wǎng)站建設一年能賺多少中國搜索網(wǎng)站排名
  • 青浦手機網(wǎng)站制作seo實戰(zhàn)密碼第三版
  • 河北省住房城鄉(xiāng)建設廳網(wǎng)站防城港網(wǎng)站seo
  • 影響網(wǎng)站速度嗎網(wǎng)站優(yōu)化哪家好
  • 網(wǎng)頁制作成品網(wǎng)站寧波百度推廣優(yōu)化
  • 鄭州做網(wǎng)站好的公企業(yè)官方網(wǎng)站推廣
  • 自己做外貿(mào)網(wǎng)站站長平臺官網(wǎng)
  • 電腦網(wǎng)站開發(fā)seo發(fā)包技術教程
  • 企業(yè)網(wǎng)站特點分析與描述百度收錄時間
  • 做網(wǎng)站 提要求win7系統(tǒng)優(yōu)化軟件
  • 做網(wǎng)站原型圖是用什么軟件業(yè)務網(wǎng)站制作
  • 網(wǎng)站后臺怎么掛廣告 怎么做長沙百度貼吧
  • 天津建設合同備案網(wǎng)站特大新聞凌晨剛剛發(fā)生
  • 小型玩具企業(yè)網(wǎng)站建設初期階段任務服務器
  • 做網(wǎng)站開發(fā)的網(wǎng)站做外鏈平臺有哪些
  • 上海裝修網(wǎng)官網(wǎng)長沙電商優(yōu)化
  • 洛陽做網(wǎng)站漢獅網(wǎng)絡seo優(yōu)化是什么意思
  • 微微網(wǎng)站建設交換友情鏈接推廣法
  • 東莞專業(yè)做網(wǎng)站的公司有哪些seo外包推廣
  • 深圳網(wǎng)站優(yōu)化教程廣州seo優(yōu)化電話
  • 邯鄲市網(wǎng)站建設新手怎么學電商運營
  • 做網(wǎng)站域名的公司網(wǎng)站模板怎么建站
  • 如何做微信官方網(wǎng)站如何快速推廣
  • 網(wǎng)站全站開發(fā)需要學什么bt櫻桃 磁力島
  • 人與狗做的網(wǎng)站手機怎么建立網(wǎng)站
  • 如何測試 網(wǎng)站seo免費教程
  • 網(wǎng)站無障礙建設規(guī)定北京seo優(yōu)化哪家公司好