成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
今天這篇文章討論了一個很常見的 Go 面試問題,內容涉及切片作為函數參數的傳遞和修改。重點在于切片作為參數是按值傳遞的,因此函數內部的修改不會影響外部變量。

大家好,我是煎魚。

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

今天和大家學習 @Harutyun Mardirossian 大佬分享的面試題,一起進步!

面試問題

請先在腦子里思考一下具體的運行結果,再查看答案。

如下代碼:

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

func doSomething(a []int) {
    a = append(a, 1)
}

面試問題:fmt.Println 的輸出結果是什么?

問題解析

運行程序,查看輸出結果:

[]

fmt.Println 最終打印的是一個長度為 0 的切片。

答案是:空切片。(你答對了嗎?)

在 Go 中,函數參數是按值傳遞的,這意味著上述代碼在參數傳遞時,創建了參數值的副本并傳遞給函數。

而切片實際上是一個包含長度(len)、容量(cap)和指向底層數組指針(data)的結構體。

當我們將切片作為函數參數傳遞時,實質上復制的是切片的 SliceHeader,對應的底層數組是保持不變的。

結合代碼來講,就是因為在 doSomething 函數中,創建了 SliceHeader 的新副本。然后 append 函數會在超過容量時重新分配新切片,并返回更新后的切片。

深入驗證

我們可以使用 unsafe 包去打印 SliceHeader(切片頭),進行進一步的驗證和分析。

如下代碼:

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)
}

輸出結果:

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

兩個切片的 Data 指針地址指向的是同一個底層數組。但由于長度不同,它們在應用的表現上是兩個不同的切片。

這也印證了前面問題的結果是輸出了空切片,切片長度為 0 的內部原理。

變通方法

這種情況下,建議是修改寫法,提高代碼易讀性。否則后續維護也比較麻煩,不熟悉的同學咋一眼一看很有可能發現不了問題。

但如果你還是希望輸出你想要的切片值,可以采取以下變通方法。

改動后的代碼:

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

func doSomething(a []int) {
    a = append(a, 1)
}

輸出結果:

[1]

原因是在進行 s[:1] 切片操作時,本質上是創建了一個新的 SliceHeader,所以可以正常打印和獲取預期的元素。

當然,還有一種常見的寫法就是切片 append 等變更后一定做一遍再賦值,這樣可以規避掉不少使用上的細節坑。

總結

今天這篇文章討論了一個很常見的 Go 面試問題,內容涉及切片作為函數參數的傳遞和修改。

重點在于切片作為參數是按值傳遞的,因此函數內部的修改不會影響外部變量。

如果仍然希望獲取可以通過切片操作,重新切分一下新的切片結果集就可以了。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2024-11-28 08:33:16

JavaScrip事件循環this

2023-06-26 00:03:55

Go語言類型

2021-07-08 23:53:44

Go語言拷貝

2010-08-31 15:03:28

DB2游標

2012-07-24 17:10:10

Linux操作系統

2010-04-29 12:42:09

Unix系統

2024-09-30 11:08:18

JSON局限性數據

2021-08-01 00:08:06

JsonGo標準庫

2010-07-07 10:12:44

SQL Server

2010-02-23 17:57:58

Python部署

2009-07-16 17:26:11

WebWork文件上傳

2010-11-23 15:50:44

MySQL中文建表

2009-11-05 15:36:58

WCF service

2023-07-03 00:44:26

Go語言MySQL

2012-10-11 10:26:44

云計算應用程序部署

2010-01-28 13:15:43

C++參數

2009-07-20 14:04:27

WebWork標簽嵌套

2012-05-23 13:11:10

架構存儲

2009-11-27 10:02:54

PHP mb_strw

2018-06-19 16:50:03

編程語言Python面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区三区久久久 | 国产精品久久久久久久久久 | 日韩免费av | 成人一区二区三区 | 亚洲国产成人久久久 | 国产成人一区二区三区 | 97人人干| 一区二区在线视频 | 日韩国产欧美一区 | 国产一区 | 久久久免费在线观看 | 日韩中文字幕 | h片在线免费看 | 国产69精品久久99不卡免费版 | 在线播放亚洲 | 91麻豆产精品久久久久久 | 97国产在线观看 | 国产精品久久久久久久久免费丝袜 | 日韩一区二区福利 | 久久精品国产一区二区电影 | 成人在线免费观看 | av片网站| 午夜欧美| 色接久久 | 丁香婷婷久久久综合精品国产 | 妞干网av| 91久久国产综合久久 | 国产精品久久国产精品久久 | 日本视频一区二区三区 | 亚洲欧美视频在线观看 | 亚洲高清av | 精品欧美乱码久久久久久 | 精品国产一区二区 | 久久久国产精品入口麻豆 | 国产一区二区在线免费观看 | 亚洲精品九九 | 国产精久久久 | 国产在线精品区 | www.色.com| 综合网中文字幕 | 亚洲传媒在线 |