《Go語言圣經》結構體

《Go語言圣經》結構體

一、結構體指針的高效應用

在處理大型結構體時,為避免內存復制,通常使用指針傳遞和返回結構體:

// 通過指針傳入結構體,避免值拷貝
func Bonus(e *Employee, percent int) int {return e.Salary * percent / 100
}// 必須使用指針才能修改原始結構體數據
func AwardAnnualRaise(e *Employee) {e.Salary = e.Salary * 105 / 100
}

關鍵點:

  • Go語言函數參數傳遞均為值拷貝
  • 指針傳遞避免大數據結構復制開銷
  • 修改原結構體必須通過指針實現
二、結構體比較機制

若結構體所有字段均可比較,則該結構體可直接使用==!=比較:

type Point struct{ X, Y int }p := Point{1, 2}
q := Point{2, 1}fmt.Println(p.X == q.X && p.Y == q.Y) // false
fmt.Println(p == q)                   // false (等價寫法)

注意事項:

  • 結構體包含不可比較字段(如slice、map)時不可比較
  • 比較操作會遞歸檢查所有字段
三、結構體嵌入機制深度解析
1. 基本嵌入語法

通過匿名字段實現結構體嵌入:

type Point struct{ X, Y float64 }// 嵌入Point結構體
type ColoredPoint struct {Point      // 匿名字段,僅聲明類型Color color.RGBA
}// 使用示例
var cp ColoredPoint
cp.X = 1          // 直接訪問嵌入字段
cp.Point.X = 1    // 等價訪問方式

特性總結:

  • 嵌入類型的所有字段和方法被提升為外部類型
  • 支持直接訪問和顯式訪問兩種方式
  • 編譯時自動生成訪問包裝函數
2. 方法"繼承"機制

嵌入類型的方法會被自動提升:

// Point類型的方法
func (p Point) Distance(q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}func (p *Point) ScaleBy(factor float64) {p.X *= factorp.Y *= factor
}// ColoredPoint可直接使用Point的方法
var p = ColoredPoint{Point{1,1}, color.RGBA{255,0,0,255}}
var q = ColoredPoint{Point{5,4}, color.RGBA{0,0,255,255}}fmt.Println(p.Distance(q.Point)) // 直接調用Point的方法
p.ScaleBy(2)                     // 支持指針方法

編譯器行為:

// 編譯器自動生成的包裝方法
func (cp ColoredPoint) Distance(q Point) float64 {return cp.Point.Distance(q)
}func (cp *ColoredPoint) ScaleBy(factor float64) {cp.Point.ScaleBy(factor)
}
3. 嵌入與繼承的本質區別

Go語言的嵌入實現"has a"關系,而非"is a"關系:

var cp ColoredPoint
var p Pointp = cp        // 錯誤:類型不兼容
p = cp.Point  // 正確:顯式獲取嵌入實例p.Distance(q)         // 錯誤:q不是Point類型
p.Distance(q.Point)   // 正確:顯式傳遞Point字段

關鍵點:

  • 嵌入不改變類型系統
  • 方法調用需顯式匹配參數類型
  • 保持類型獨立性,避免繼承帶來的耦合問題
4. 指針嵌入的高級應用

通過嵌入指針實現數據共享:

type ColoredPoint struct {*Point      // 嵌入指針類型Color color.RGBA
}// 共享同一個Point實例
p := ColoredPoint{&Point{1,1}, red}
q := ColoredPoint{&Point{5,4}, blue}
q.Point = p.Point  // 共享同一實例p.ScaleBy(2)        // 修改會影響所有引用fmt.Println(*p.Point) // 輸出: {2 2}
fmt.Println(*q.Point) // 輸出: {2 2}

指針嵌入特性:

  • 支持多實例共享底層數據
  • 方法調用自動解引用(p.ScaleBy()等價于(*p.Point).ScaleBy()
  • 適用于需要數據共享的場景
四、最佳實踐建議
  1. 大型結構體一律使用指針傳遞
  2. 需修改原始數據時必須使用指針
  3. 優先使用結構體嵌入而非接口組合復雜類型
  4. 根據數據共享需求選擇值嵌入或指針嵌入
  5. 通過顯式訪問保持類型清晰性,避免命名沖突

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85295.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ascend上如何進行帶寬測試

1 工具安裝 1.1 下載鏈接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安裝指令: ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install設置環境變量: source /usr/local/Ascend/toolbox/set_env.…

生產BUG集

磁盤達到閾值導致ES無法刪除數據 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI與Selenium的智能開關狀態管理系統實踐

引言 在工業物聯網(IIoT)與自動化控制場景中,設備狀態的實時監控與自然語言指令執行是提升效率的關鍵。本文將介紹一種基于 FastAPI 和 Selenium 的智能設備狀態管理系統,通過大語言模型(LLM)解析用戶指令…

主體和債項均為“AAA”等級 海爾消金發行10億金融債

6月18日,繼年內發行ABS、落地ESG掛鉤銀團貸后,海爾消費金融(以下簡稱“海爾消金”)在金融市場上又邁出重要一步,成功簿記發行2025年首期規模達10億元金融債,且主體信用等級仍為“AAA”。這一舉措為海爾消金…

n8n:輕松自動化您的工作流

借助開源自動化利器 n8n,釋放重復勞動的生產力! 引言 n8n 是一款免費、開源的工作流自動化工具,致力于幫助開發者和團隊通過連接各種應用和服務,實現重復任務的自動化處理。 它由 Jan Oberhauser 于 2019 年在德國柏林創建&…

Angular--Hello(TODO)

最近有個小錯誤,因為最近還是在看thingsboard,最近終于看到前端的代碼,突然發現怎么全是ts的文件,仔細一看原來并不是之前認為的AngularJS,而是Angular。。。我tm真的無語了,又要去重新學。。。 Angular的…

在 Linux 系統中通過 yum 安裝 Sublime Text

在 Linux 系統中通過 yum 安裝 Sublime Text 的步驟如下: ?步驟 1:導入 GPG 公鑰? sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 這一步用于驗證軟件包的合法性。 ?步驟 2:添加 Sublime Text 的軟件倉…

面向自主多星對地觀測的多智能體強化學習

大家讀完覺的有幫助記得及時關注和點贊!!! 抽象 近地軌道 (LEO) 衛星的指數級增長徹底改變了地球觀測 (EO) 任務,解決了氣候監測、災害管理等方面的挑戰。然而,多衛星系統…

flutter 短視頻相關插件選型

?插件名稱??核心優勢??缺點??短視頻場景適用性??推薦指數??video_player? (官方基礎庫)? 官方維護,跨平臺兼容性最佳(iOS/Android/macOS) ? 輕量級,無額外依賴,啟動速度快 ? 支持本地/網絡視頻、基礎播…

QTableView為例:Qt模型視圖委托(MVD)(Model-View-Delegate)

文章目錄 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView為例 1. QT中的MVD模式 模型視圖委托(MVD)是Qt中特有的設計模式,類似MVC設計模式,將MVC設計模式中的Controller當做MVD中的Delegate,兩者的概念基…

uni-app總結3-項目新建運行調試

一、新建項目 通過HbuilderX新建 在點擊工具欄里的文件 -> 新建 -> 項目(快捷鍵CtrlN,MacOS上是CMD N): 左測Tab選擇uni-app類型,輸入工程名,選擇模板,Vue版本選擇3,其他不…

LeetCode 每日一題打卡|若谷的刷題日記 4day--移動零

移動零 題目: 給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 請注意 ,必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,1…

簡歷模板3——數據挖掘工程師5年經驗

姓名 / Your Name 數據挖掘工程師 | 5年經驗 | 推薦/畫像/反欺詐 📞 138-XXXX-XXXX | ?? your.emailexample.com | 🌐 github.com/yourname | 📍 北京 🎯 個人簡介 / Summary 5年大廠數據挖掘工程經驗,碩士學歷&am…

Vue添加圖片作為水印

直接上代碼 把圖片作為水印 <div class"info-warp"><div class"image-container"><img src"https://img.shetu66.com/2023/06/28/1687920981963810.png" /><div class"watermark-layer"><imgv-for"…

Conda 常用命令大全:從入門到高效使用

Conda 常用命令大全&#xff1a;從入門到高效使用 Conda 是 Python 生態中最流行的環境管理工具之一&#xff0c;它不僅可以管理 Python 包&#xff0c;還能創建隔離的虛擬環境&#xff0c;適用于數據分析、機器學習、科學計算等場景。本文將介紹 Conda 的常用命令&#xff0c…

【系統更新】TDuckX2.7升級!DSL邏輯、自定義Webhook、AI考試來襲

No.1 支持自定義 DSL 公式 邏輯規則支持自定義 DSL&#xff0c;通過公式表達式構建復雜邏輯條件&#xff0c;能夠支持選項、矩陣、自增表單中的內容控制&#xff0c;可以滿足多變業務場景&#xff0c;極大提升了邏輯配置的靈活性。 No.2 擴展值新增“名稱字段” 在批量生成擴…

安卓9.0系統修改定制化____深入解析安卓 9.0 各手機分區:功能、作用與差異 基礎篇二

在安卓 9.0 系統中,手機內部存儲被劃分為多個不同的分區,每個分區都承擔著獨特且重要的職責。深入了解這些分區,對于我們理解安卓系統運行機制、進行系統優化,甚至是刷機等操作都有著極大的幫助。尤其是rom定制與修改方面。 通過博文了解?????? 1??????-----了…

自動駕駛技術路線之爭:視覺派、激光雷達派與融合派,誰將引領未來?

自動駕駛的賽道上&#xff0c;科技巨頭、傳統車企和初創公司紛紛亮出“看家本領”。但你是否注意到&#xff0c;不同玩家的“眼睛”和“大腦”配置大相徑庭&#xff1f;特斯拉CEO馬斯克曾稱“激光雷達是徒勞的拐杖”&#xff0c;而國內華為、小鵬等企業則堅定擁抱激光雷達。這背…

Spring Cloud Alibaba 中間件

Spring Cloud Alibaba 中間件 &#x1f517; Spring官方介紹 [??Spring官方對Spring Cloud Alibaba的更新不及時] &#x1f517; Spring Cloud Alibaba官網 &#x1f4dd; 代碼記錄 Nacos&#xff08;服務注冊與發現&#xff09; Nacos(Dynamic Naming and Configuration…

uniapp+vue中 多次觸發onLoad/created

控制臺log輸出為何頻頻失蹤?   wxss代碼為何頻頻失效?   wxml布局為何亂作一團?   究竟是道德的淪喪?還是人性的缺失?   讓我們一起來 走 跑進科學 前言 uniapp中開發網頁h5&#xff0c;莫名其妙每次請求接口都會執行兩次&#xff0c;仔細排查發現是onLoadonShow…