Go中slice和map引用傳遞誤區

背景

關于slice和map是指傳遞還是引用傳遞,很多文章都分析得模棱兩可,其實在Go中只有值傳遞,但是很多情況下是因為分不清slice和map的底層實現,所以導致很多人在這一塊產生疑惑,下面通過代碼案例分析slice和map到底是值傳遞還是引用傳遞。

案例分析

func main() {list := make([]int, 10)fmt.Printf("list addr:%p\n", list)fmt.Println("list size:", len(list))listExpand(list)fmt.Println("expand list size:", len(list))m := make(map[int]int, 0)fmt.Printf("map addr:%p\n", m)fmt.Println("map size:", len(m))mapExpand(m)fmt.Println("expand size:", len(m))
}func mapExpand(m map[int]int) {for i := range 10 {m[i] = i}fmt.Printf("expand map addr:%p\n", m)
}func listExpand(list []int) {for i := range 10 {list = append(list, i)}fmt.Printf("expand list addr:%p\n", list)
}

上面代碼的輸出結果:

list addr:0xc000010500
list size: 10
expand list addr:0xc0000220a0
expand list size: 10
map addr:0xc00001e180
map size: 0
expand map addr:0xc00001e180
expand size: 10

可以清楚的看到,都沒有使用指針的情況下,兩者的結果都不一樣,map在擴容前后都是同一個內存地址,但是slice在沒擴容都不為同一個內存地址。
可能會更疑惑了,這結果是想說明,map是引用傳遞,slice是值傳遞嗎?

在Go的1.8版本源碼中
hashmap的make實現如下:
在這里插入圖片描述
可以清楚的看到,通過make創建的map其實返回的是hamp結構體的指針。
slice的make實現如下:
在這里插入圖片描述
可以清楚的看到,通過make創建的slice其實返回的是slice的結構體,并不是指針。

所以,結論很清晰了,其實Go中只有值傳遞,因為各個引用類型底層實現的不同導致的結果不一致,因為創建map返回的是指針,所以傳遞map時,擴容了也不會導致和預期不一樣的結果;而slice的創建返回的是結構體,如果擴容了,則會導致底層數組的變化,不一定是預期的結果。

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

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

相關文章

20250225-代碼筆記03-class CVRPModel AND other class

文章目錄 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函數功能函數代碼 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函數功能函數代碼 三、class CVRPModel(nn.Module):forward(self, state)函數功能函數代碼 四、def _get_encodi…

使用Hydra進行AI項目的動態配置管理

引言:機器學習中的超參數調優挑戰 在機器學習領域,超參數調優是決定模型性能的關鍵環節。不同的模型架構,如神經網絡中的層數、節點數,決策樹中的最大深度、最小樣本分割數等;以及各種訓練相關的超參數,像學習率、優化器類型、批量大小等,其取值的選擇對最終模型的效果…

preg_replace 與 str_replace 的比較與選擇

preg_replace 與 str_replace 的比較與選擇 ——PHP字符串處理的核心工具深度解析 一、核心功能定位 在PHP的字符串處理中,str_replace和preg_replace是兩種最常用的替換函數,但其設計目標和應用場景存在本質差異: str_replace 簡單字符串替…

嵌入式開發:傅里葉變換(4):在 STM32上面實現FFT(基于STM32L071KZT6 HAL庫+DSP庫)

目錄 步驟 1:準備工作 步驟 2:創建 Keil 項目,并配置工程 步驟 3:在MDK工程上添加 CMSIS-DSP 庫 步驟 5:編寫代碼 步驟 6:配置時鐘和優化 步驟 7:調試與驗證 步驟 8:優化和調…

【MySQL篇】數據類型

目錄 前言: 1,數據類型的分類 ?編輯 2 ,數值類型 2.1 tinyint類型 2.2 bit類型 2.3 小數類型 2.3.1 float類型 2.3.2 decimal類型 3,字符串類型 3.1 char 3.2 varchar 3.3 char與varchar的比較 3.4日期和時間類型 3.5 …

nuxt常用組件庫html-validator應用解析

html-validator 主要用于自動驗證nuxt服務器呈現的HTML(SSR和SSG),以檢測可能導致水合錯誤的HTML常見問題,有助于減少水合錯誤,檢測常見的可訪問性錯誤。 安裝 npx nuxilatest module add html-validator配置 若自動更新nuxt.config.ts配置文…

智能圖像處理平臺:圖片管理

接著我們講圖片管理,先實現圖片基礎的增刪改查,再去考慮圖像處理。 主要是,我們需要完成查詢時,查詢的圖片的上傳者的角色等級小于等于我們當前登陸賬號。 后端controller: package com.llpp.controller;import cn.…

大模型知識蒸餾技術(8)——知識蒸餾應用場景

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 知識蒸餾概述 知識蒸餾是一種將大型復雜模型(教師模型)的知識遷移到小型簡單模型(學生模型)的技術。其核心原理是通過教師模型的輸出(通常是softmax后的概率分布)來指導學生模型的訓練,…

LeetCode:131. 分割回文串(DP Java)

目錄 131. 分割回文串 題目描述: 實現代碼與解析: 動態規劃 原理思路: 131. 分割回文串 題目描述: 給你一個字符串 s,請你將 s 分割成一些子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。…

INT202 Complexity of Algroithms 算法的復雜度

文章目錄 1. 前言1.1 算法(Algorithms)和數據結構(Data Structure)1.2 什么是好的算法?1.3 算法分析1.3.1 實驗分析(Experimental Analysis)1.3.2 理論分析1.3.2.1 偽代碼(Pseudo-co…

BDF報告翻譯簡介后:關于A φ方法criterion引理1如何由范數導出內積

關于A φ方法criterion 引理1 如何由范數導出內積 在數學中,特別是在泛函分析中,給定一個范數,可以定義一個與之相關的內積。這個過程不是總是可能的,但當一個賦范向量空間是完備的且滿足平行四邊形恒等式時,可以導出…

初識uniApp

詳細思考一下uniApp這個跨平臺開發框架。首先,我對uniApp還不是很了解,所以需要從基本概念開始,逐步深入。 什么是uniApp? 我記得uniApp是基于Vue.js的,可能是一個用來開發多個平臺的應用的框架。用戶可能想了解它是什…

olmOCR:使用VLM解析PDF

在PDF解析中,目前主流的開源工具包括Minuer、GOT OCR等。主要都是通過飛槳等OCR套件組裝的一套pipeline,或者直接通過VLM解析圖像。 #一、 olmOCR是使用VLM進行的端到端的PDF文檔解析 二、document-anchoring 與上述的不同在于,olmOCR使用…

Nginx 代理配置導致瀏覽器應用網頁頁面加載失敗的分析與解決

Nginx 代理配置導致應用頁面加載失敗的分析與解決 前期部署信息: 部署DM數據庫DEM時,配置了nginx代理,conf配置內容如下: charset utf-8;client_max_body_size 128M;listen 4567;server_name 192.168.1.156;root /opt/h5/;index…

Windows 11【1001問】查看Windows 11 版本的18種方法

隨著技術的飛速發展,操作系統作為連接硬件與軟件的核心橋梁,其版本管理和更新變得尤為重要。對于用戶而言,了解自己設備上運行的具體Windows 11版本不僅有助于優化系統性能,還能確保安全性和兼容性。然而,不同場景和需…

企業jsapi_ticket,java舉例

在企業微信開發中,使用 Java 獲取 jsapi_ticket 并生成簽名的步驟如下。以下是完整的 Java 示例代碼。 1. 獲取 jsapi_ticket 的流程 獲取 access_token。 使用 access_token 獲取 jsapi_ticket。 使用 jsapi_ticket 生成簽名(signature)。…

【Godot4.3】自定義簡易菜單欄節點ETDMenuBar

概述 Godot中的菜單創建是一個復雜的災難性工作,往往無從下手,我也是不止一次嘗試簡化菜單的創建。 從自己去年的發明“簡易樹形數據”用于簡化Tree控件獲得靈感,于是嘗試編寫了用于表示菜單數據的EasyMenuData類,以及對應的純文…

大數據與金融科技:革新金融行業的動力引擎

大數據與金融科技:革新金融行業的動力引擎 在今天的金融行業,大數據與金融科技的結合正在以驚人的速度推動著金融服務的創新與變革。通過精準的數據分析與智能化決策,金融機構能夠更高效地進行風險管理、客戶服務、資產管理等一系列關鍵操作…

二、IDE集成DeepSeek保姆級教學(使用篇)

各位看官老爺好,如果還沒有安裝DeepSeek請查閱前一篇 一、IDE集成DeepSeek保姆級教學(安裝篇) 一、DeepSeek在CodeGPT中使用教學 1.1、Edit Code 編輯代碼 選中代碼片段 —> 右鍵 —> CodeGPT —> Edit Code, 輸入自然語言可編輯代碼,點擊S…

Rohm發布TOLL封裝650V GaN HEMT,引領汽車用GaN器件大規模生產新浪潮

Rohm震撼發布TOLL封裝650V GaN HEMT,引領汽車用GaN器件大規模生產新浪潮。在創新的TOLL(TO LeadLess)封裝技術的懷抱中,Rohm精心孕育出650V GaN HEMT這一瑰寶,此技術正如一股強勁東風,日益吹拂于高功率處理…