最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go變量指針的實(shí)現(xiàn)示例

 更新時(shí)間:2025年09月26日 09:19:02   作者:Jayden_念舊  
Go指針存儲(chǔ)變量地址,用于修改變量、避免拷貝、動(dòng)態(tài)分配,本文就來詳細(xì)的介紹一下Go變量指針的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在Go語言中,指針是一個(gè)存儲(chǔ)變量內(nèi)存地址的變量。通過指針,可以間接訪問和操作原始數(shù)據(jù)。從而提高程序的效率,特別是在處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)或需要共享數(shù)據(jù)時(shí)。

概念說明
指針聲明var p *int
取地址&a → 獲取 a 的地址
解引用*p → 訪問 p 指向的值
零值nil
主要用途修改變量、避免拷貝、動(dòng)態(tài)分配

1.指針的本質(zhì)

  • 指針是一種特殊變量,其值是另一個(gè)變量的內(nèi)存地址。
  • 通過指針可以間接訪問或修改原始變量的值。

2.聲明指針

語法:var ptr *Type

var a int = 10
var ptr *int // 聲明一個(gè)指向 int 類型的指針
ptr = &a     // 將 a 的內(nèi)存地址賦值給 ptr

3.關(guān)鍵操作符

  • &(取地址符):獲取變量的內(nèi)存地址。
ptr = &a // ptr 現(xiàn)在存儲(chǔ) a 的地址
  • *解引用符):訪問指針指向的原始值。
  fmt.Println(*ptr) // 輸出 10(通過 ptr 訪問 a 的值)
  *ptr = 20         // 修改 a 的值為 20

4.指針的零值

  • 未初始化的指針值為 nil(表示無指向)。
var ptr *int // 初始值為 nil

5.指針的用途

  • 修改函數(shù)外部的變量
  func modify(val *int) {
      *val = 100
  }
  func main() {
      x := 10
      modify(&x) // x 被修改為 100
  }
  • 避免大對象拷貝:傳遞結(jié)構(gòu)體指針而非整個(gè)結(jié)構(gòu)體,減少內(nèi)存開銷。
  type Data struct { /* 大結(jié)構(gòu)體 */ }
  func process(d *Data) { /* 操作 d */ }
  • 動(dòng)態(tài)內(nèi)存分配:與 new 或復(fù)合字面量一起使用。
  p := new(int) // 分配內(nèi)存,返回指針
  *p = 42

6.指針示例

package main
 
import (
	"fmt"
)
 
type Person struct {
	Name    string
	Age     int
	Address string
	Salary  float64
}
 
func NewPerson(name string, age int, address string, salary float64) *Person {
	return &Person{Name: name, Age: age, Address: address, Salary: salary}
}
 
func main() {
	// 創(chuàng)建Person實(shí)例
	p := NewPerson("張三", 30, "北京市海淀區(qū)", 15000.50)
 
	// 訪問字段
	fmt.Println(p.Name)   // 輸出:張三
	fmt.Println(p.Salary) // 輸出:15000.5
 
	// 修改字段值
	p.Age = 31
	p.Salary = 16000.00
}

為什么使用創(chuàng)建結(jié)構(gòu)體指針:

1.內(nèi)存效率優(yōu)化

// 值類型返回(產(chǎn)生完整結(jié)構(gòu)體拷貝)
func NewPerson() Person {
    return Person{...}
}

// 指針類型返回(僅傳遞內(nèi)存地址)
func NewPerson() *Person {
    return &Person{...}
}
  • 結(jié)構(gòu)體大小:當(dāng)結(jié)構(gòu)體包含多個(gè)字段(特別是包含大數(shù)組等)時(shí),指針傳遞(通常 8 字節(jié))比值拷貝更高效
  • 調(diào)用鏈損耗:在方法調(diào)用鏈中多次傳遞時(shí),指針傳遞始終維持固定內(nèi)存開銷

2. 可變性控制

p := NewPerson("李四", 28, "上海", 25000)
p.Age = 29 // 直接修改原結(jié)構(gòu)體

// 值類型接收者方法示例(無法修改原結(jié)構(gòu)體)
func (p Person) SetAge(age int) {
    p.Age = age // 僅修改副本
}

// 指針類型接收者方法示例
func (p *Person) RealSetAge(age int) {
    p.Age = age // 修改原結(jié)構(gòu)體
}
  • 指針接收者:通過返回指針,后續(xù)可以方便地定義指針接收者方法
  • 狀態(tài)一致性:確保所有方法操作都作用于同一個(gè)內(nèi)存對象

3. 零值有效性

// 錯(cuò)誤處理擴(kuò)展性
func NewPerson(age int) (*Person, error) {
    if age < 0 {
        return nil, errors.New("invalid age")
    }
    return &Person{Age: age}, nil
}
  • nil 語義:當(dāng)構(gòu)造函數(shù)需要實(shí)現(xiàn)錯(cuò)誤處理時(shí),指針類型可以直接返回 nil
  • 可選對象:調(diào)用方可通過 if p != nil 判斷對象是否有效

7.注意?。。。。。?!

  • 空指針(nil):解引用 nil 指針會(huì)導(dǎo)致運(yùn)行時(shí) panic。
  • 指針?biāo)阈g(shù):Go 不支持指針?biāo)阈g(shù)(如 ptr++),除非使用 unsafe 包(不推薦)。
  • 值傳遞 vs 指針傳遞函數(shù)參數(shù)默認(rèn)值傳遞,需用指針實(shí)現(xiàn)引用傳遞。

擴(kuò)展:使用指針修改原始變量和通過函數(shù)修改的區(qū)別是什么

原理差異

  • 指針修改:在 Go 里,字符串是不可變類型,若要通過指針修改字符串,實(shí)際上修改的是存儲(chǔ)字符串的字節(jié)切片。因?yàn)樽址讓佑勺止?jié)數(shù)組構(gòu)成,借助指針操作可改變字節(jié)切片內(nèi)容,再轉(zhuǎn)換回字符串,從而更新原始變量。
  • strings.Builder 修改strings.Builder 內(nèi)部維護(hù)一個(gè)字節(jié)切片,提供方法將字符串追加到該切片。當(dāng)調(diào)用 String 方法時(shí),會(huì)把內(nèi)部字節(jié)切片轉(zhuǎn)換為字符串返回。這種方式不會(huì)直接修改原始字符串,而是生成新字符串后重新賦值給原始變量。

代碼實(shí)現(xiàn)差異

指針修改示例

package main
 
import (
    "fmt"
)
 
func modifyString(s *string) {
    bytes := []byte(*s)
    bytes = append(bytes, ' ', 'a', 'b', 'c')
    *s = string(bytes)
}
 
func main() {
    str := "this is a string"
    fmt.Println(&str)
    modifyString(&str)
    fmt.Println(str)
}

strings.Builder修改示例

package main
 
import (
	"fmt"
	"strings"
)
 
func main() {
	str := "this is a string"
	fmt.Println(&str)
	// 創(chuàng)建一個(gè) strings.Builder 實(shí)例
	var builder strings.Builder
	// 將原始字符串寫入 Builder
	builder.WriteString(str)
	// 在末尾添加 abc
	builder.WriteString(" abc")
	// 獲取最終的字符串
	str = builder.String()
	fmt.Println(str)
}

性能差異

  • 指針修改:每次修改都要將字符串轉(zhuǎn)換為字節(jié)切片,修改后再轉(zhuǎn)換回字符串,頻繁轉(zhuǎn)換會(huì)帶來額外內(nèi)存分配和復(fù)制開銷,性能欠佳。
  • strings.Builder 修改:內(nèi)部維護(hù)字節(jié)切片,可動(dòng)態(tài)擴(kuò)容,減少內(nèi)存分配次數(shù),拼接字符串時(shí)性能更優(yōu),尤其在處理大量字符串拼接時(shí)優(yōu)勢明顯。

使用場景差異

  • 指針修改:適用于需要直接操作原始變量內(nèi)存地址,且修改操作較少的場景,或者希望通過函數(shù)修改外部變量的場景。
  • strings.Builder 修改適合需要頻繁進(jìn)行字符串拼接的場景,能有效提升性能。

到此這篇關(guān)于Go變量指針的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go變量指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Go語言創(chuàng)建結(jié)構(gòu)體實(shí)例對象的幾種常用方式

    Go語言創(chuàng)建結(jié)構(gòu)體實(shí)例對象的幾種常用方式

    在Go語言中,創(chuàng)建結(jié)構(gòu)體實(shí)例的幾種方式有本質(zhì)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • GO?env環(huán)境變量配置命令使用

    GO?env環(huán)境變量配置命令使用

    這篇文章主要為大家介紹了GO?env環(huán)境變量配置命令使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • golang三元表達(dá)式的使用方法

    golang三元表達(dá)式的使用方法

    這篇文章主要介紹了golang三元表達(dá)式的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Go語言中GORM存取數(shù)組/自定義類型數(shù)據(jù)

    Go語言中GORM存取數(shù)組/自定義類型數(shù)據(jù)

    在使用gorm時(shí)往往默認(rèn)的數(shù)據(jù)類型不滿足我們的要求,需要使用一些自定義數(shù)據(jù)類型作為字段類型,下面這篇文章主要給大家介紹了關(guān)于Go語言中GORM存取數(shù)組/自定義類型數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • k8s容器互聯(lián)-flannel?host-gw原理篇

    k8s容器互聯(lián)-flannel?host-gw原理篇

    這篇文章主要為大家介紹了k8s容器互聯(lián)-flannel?host-gw原理篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go設(shè)計(jì)模式之中介者模式講解和代碼示例

    Go設(shè)計(jì)模式之中介者模式講解和代碼示例

    中介者是一種行為設(shè)計(jì)模式,讓程序組件通過特殊的中介者對象進(jìn)行間接溝通,達(dá)到減少組件之間依賴關(guān)系的目的,因此本文就給大家詳細(xì)介紹一下Go中介者模式,需要的朋友可以參考下
    2023-06-06
  • web項(xiàng)目中g(shù)olang性能監(jiān)控解析

    web項(xiàng)目中g(shù)olang性能監(jiān)控解析

    這篇文章主要為大家介紹了web項(xiàng)目中g(shù)olang性能監(jiān)控詳細(xì)的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Kotlin編程基礎(chǔ)語法編碼規(guī)范

    Kotlin編程基礎(chǔ)語法編碼規(guī)范

    這篇文章主要為大家介紹了Kotlin編程條件控制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 基于Go語言實(shí)現(xiàn)Base62編碼的三種方式以及對比分析

    基于Go語言實(shí)現(xiàn)Base62編碼的三種方式以及對比分析

    Base62 編碼是一種在字符編碼中使用62個(gè)字符的編碼方式,在計(jì)算機(jī)科學(xué)中,,Go語言是一種靜態(tài)類型、編譯型語言,它由Google開發(fā)并開源,本文給大家介紹了Go語言實(shí)現(xiàn)Base62編碼的三種方式以及對比分析,需要的朋友可以參考下
    2025-05-05
  • 讓Go反射變快的方法實(shí)例探究

    讓Go反射變快的方法實(shí)例探究

    反射允許你在運(yùn)行時(shí)獲得有關(guān) Go 類型的信息,如果你曾經(jīng)愚蠢地嘗試編寫 json.Unmarshal 之類的新版本,本文將探討的就是如何使用反射來填充結(jié)構(gòu)體值
    2024-01-01

最新評論

平远县| 方城县| 宁安市| 缙云县| 新兴县| 社旗县| 凉山| 正安县| 道真| 青州市| 库尔勒市| 宣武区| 麦盖提县| 沙坪坝区| 钟祥市| 博乐市| 凭祥市| 丹阳市| 深水埗区| 仁布县| 兴安县| 吉隆县| 鄂托克旗| 宜黄县| 那坡县| 浦江县| 望江县| 申扎县| 宜黄县| 诏安县| 鄢陵县| 都昌县| 衡阳县| 石阡县| 延川县| 旬邑县| 霍城县| 韩城市| 桐梓县| 平武县| 新野县|