AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

面試問題

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

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

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

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

問題解析

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

[]

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

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

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

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

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

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

深入驗證

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

如下代碼:UZv28資訊網——每日最新資訊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)}

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

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

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

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

變通方法

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

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

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

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

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

[1]

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

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

總結

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現“美團直播”的固定入口。在直播聚合頁面,外賣“神槍手”直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top