日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 面試中的隱藏陷阱:SliceHeader 問題解析

來源: 責編: 時間:2024-06-12 17:31:35 161觀看
導讀大家好,我是煎魚。最近也是面試季+畢業季了,很多同學正在積極準備面試。尤其是很多同學,已經通過官網資料熟悉了 Go 基本語法,但沒有太大把握。希望對一些常見的棘手面試問題做一些預習。今天和大家學習 @Harutyun Mardir

大家好,我是煎魚。mmQ28資訊網——每日最新資訊28at.com

最近也是面試季+畢業季了,很多同學正在積極準備面試。尤其是很多同學,已經通過官網資料熟悉了 Go 基本語法,但沒有太大把握。希望對一些常見的棘手面試問題做一些預習。mmQ28資訊網——每日最新資訊28at.com

今天和大家學習 @Harutyun Mardirossian 大佬分享的面試題,一起進步!mmQ28資訊網——每日最新資訊28at.com

面試問題

請先在腦子里思考一下具體的運行結果,再查看答案。mmQ28資訊網——每日最新資訊28at.com

如下代碼:mmQ28資訊網——每日最新資訊28at.com

func main() {    s := make([]int, 0, 2)    doSomething(s)    fmt.Println(s)}func doSomething(a []int) {    a = append(a, 1)}

面試問題:fmt.Println 的輸出結果是什么?mmQ28資訊網——每日最新資訊28at.com

問題解析

運行程序,查看輸出結果:mmQ28資訊網——每日最新資訊28at.com

[]

fmt.Println 最終打印的是一個長度為 0 的切片。mmQ28資訊網——每日最新資訊28at.com

答案是:空切片。(你答對了嗎?)mmQ28資訊網——每日最新資訊28at.com

在 Go 中,函數參數是按值傳遞的,這意味著上述代碼在參數傳遞時,創建了參數值的副本并傳遞給函數。mmQ28資訊網——每日最新資訊28at.com

而切片實際上是一個包含長度(len)、容量(cap)和指向底層數組指針(data)的結構體。mmQ28資訊網——每日最新資訊28at.com

當我們將切片作為函數參數傳遞時,實質上復制的是切片的 SliceHeader,對應的底層數組是保持不變的。mmQ28資訊網——每日最新資訊28at.com

結合代碼來講,就是因為在 doSomething 函數中,創建了 SliceHeader 的新副本。然后 append 函數會在超過容量時重新分配新切片,并返回更新后的切片。mmQ28資訊網——每日最新資訊28at.com

深入驗證

我們可以使用 unsafe 包去打印 SliceHeader(切片頭),進行進一步的驗證和分析。mmQ28資訊網——每日最新資訊28at.com

如下代碼:mmQ28資訊網——每日最新資訊28at.com

type SliceHeader struct {    Data uintptr    Len  int    Cap  int}func main() {    s := make([]int, 0, 2)    sh := (*SliceHeader)(unsafe.Pointer(&s))    fmt.Println(sh)    doSomething(s)}func doSomething(a []int) {    a = append(a, 1)    sh := (*SliceHeader)(unsafe.Pointer(&a))    fmt.Println(sh)}

輸出結果:mmQ28資訊網——每日最新資訊28at.com

&{1374389592336 0 2} // main&{1374389592336 1 2} // doSomething

兩個切片的 Data 指針地址指向的是同一個底層數組。但由于長度不同,它們在應用的表現上是兩個不同的切片。mmQ28資訊網——每日最新資訊28at.com

這也印證了前面問題的結果是輸出了空切片,切片長度為 0 的內部原理。mmQ28資訊網——每日最新資訊28at.com

變通方法

這種情況下,建議是修改寫法,提高代碼易讀性。否則后續維護也比較麻煩,不熟悉的同學咋一眼一看很有可能發現不了問題。mmQ28資訊網——每日最新資訊28at.com

但如果你還是希望輸出你想要的切片值,可以采取以下變通方法。mmQ28資訊網——每日最新資訊28at.com

改動后的代碼:mmQ28資訊網——每日最新資訊28at.com

func main() {    s := make([]int, 0, 2)    doSomething(s)    fmt.Println(s[:1]) // 進行新的切片操作}func doSomething(a []int) {    a = append(a, 1)}

輸出結果:mmQ28資訊網——每日最新資訊28at.com

[1]

原因是在進行 s[:1] 切片操作時,本質上是創建了一個新的 SliceHeader,所以可以正常打印和獲取預期的元素。mmQ28資訊網——每日最新資訊28at.com

當然,還有一種常見的寫法就是切片 append 等變更后一定做一遍再賦值,這樣可以規避掉不少使用上的細節坑。mmQ28資訊網——每日最新資訊28at.com

總結

今天這篇文章討論了一個很常見的 Go 面試問題,內容涉及切片作為函數參數的傳遞和修改。mmQ28資訊網——每日最新資訊28at.com

重點在于切片作為參數是按值傳遞的,因此函數內部的修改不會影響外部變量。mmQ28資訊網——每日最新資訊28at.com

如果仍然希望獲取可以通過切片操作,重新切分一下新的切片結果集就可以了。mmQ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-93368-0.htmlGo 面試中的隱藏陷阱:SliceHeader 問題解析

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C#托管堆遭破壞問題溯源分析

下一篇: 基于 Spring Boot 與 WebSocket 實現實時車位管理與狀態更新

標簽:
  • 熱門焦點
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業發布的ESG報告。ESG是“環境保
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的“網紅”。7月5日至9日,為期5天的東方甄選“甘肅行”首次在自有App內直播,
  • OPPO、vivo、小米等國內廠商Q2在印度智能手機市場份額依舊高達55%

    7月20日消息,據外媒報道,研究機構的報告顯示,在全球智能手機出貨量同比仍在下滑的大背景下,印度這一有潛力的市場也未能幸免,出貨量同比也有下滑,多家廠
  • 上海舉辦人工智能大會活動,建設人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術、新產品、新應用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發展盛典人工
Top 主站蜘蛛池模板: 淮阳县| 通河县| 渝中区| 隆尧县| 乌拉特后旗| SHOW| 宁城县| 泰和县| 多伦县| 临湘市| 漠河县| 扶风县| 无锡市| 泾川县| 富民县| 海城市| 宁远县| 通渭县| 屯昌县| 吉木乃县| 邵阳市| 巴马| 山阴县| 常宁市| 永顺县| 寿宁县| 雅安市| 谢通门县| 灵武市| 宝坻区| 徐水县| 都安| 建始县| 阳新县| 上虞市| 湖口县| 甘孜| 富平县| 晋江市| 贵南县| 曲松县|