目錄
問題內容
首頁 後端開發 Golang 結構體切片! =它實現的介面切片?

結構體切片! =它實現的介面切片?

Feb 09, 2024 pm 01:03 PM
go語言 overflow

結構體切片! =它實現的介面切片?

php小編蘋果在這裡為大家揭開一個有關結構體切片的謎題:結構體切片與它實現的介面切片之間的差別是什麼?在Go語言中,切片是一種方便且靈活的資料結構,可以動態改變大小。而結構體切片則是切片的一種特殊形式,它儲存的是結構體類型的元素。但是,它與實現了相同介面的切片之間有何不同?讓我們一起來揭曉答案。

問題內容

我有一個介面Model,它是由struct Person實現的。

為了取得模型實例,我有以下輔助函數:

func newModel(c string) Model {
    switch c {
    case "person":
        return newPerson()
    }
    return nil
}

func newPerson() *Person {
    return &Person{}
}
登入後複製

上述方法允許我傳回一個正確類型的 Person 實例(稍後可以使用相同的方法輕鬆新增模型)。

當我嘗試執行類似的操作來返回模型切片時,出現錯誤。程式碼:

func newModels(c string) []Model {
    switch c {
    case "person":
        return newPersons()
    }
    return nil
}

func newPersons() *[]Person {
    var models []Person
    return &models
}
登入後複製

Go 抱怨: 無法使用 newPersons()(型別 []Person)作為傳回參數中的型別 []Model

#

我的目標是傳回請求的任何模型類型的切片(無論是[]Person[]FutureModel[]Terminator2000

# e)。我缺少什麼,如何正確實施這樣的解決方案?

解決方法

這與我剛剛回答的問題非常相似:https://www.php.cn/link/2c029952e202c0e560626a4c5980d64c

##

簡短的回答是你是對的。結構體的切片不等於結構體實現的介面的切片。

[]Person[]Model 有不同的記憶體佈局。這是因為它們所屬的類型具有不同的記憶體佈局。 Model 是一個介面值,這意味著在記憶體中它的大小為兩個字。一個詞代表類型訊息,另一個詞代表數據。 Person 是一個結構,其大小取決於它包含的欄位。為了從 []Person 轉換為 []Model

,您需要循環數組並對每個元素進行類型轉換。

由於此轉換是一個 O(n) 操作並且會導致建立一個新切片,因此 Go 拒絕隱含執行此操作。您可以使用以下程式碼明確地執行此操作。

models := make([]Model, len(persons))
for i, v := range persons {
    models[i] = Model(v)
}
return models
登入後複製
正如 dskinner 指出的

,您很可能需要一個指標切片,而不是指向切片的指標。通常不需要指向切片的指標。 ###
*[]Person        // pointer to slice
[]*Person        // slice of pointers
登入後複製

以上是結構體切片! =它實現的介面切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表 比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表 Jan 15, 2025 pm 08:11 PM

比特幣誕生至今價格2009-2025 最完整的BTC歷史價格總表

Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法 Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法 May 06, 2024 pm 01:20 PM

Windows11右下角時間沒了怎麼辦_Windows11右下角時間沒了解決方法

怎麼用別人的程式碼 怎麼用別人的程式碼 May 05, 2024 pm 07:54 PM

怎麼用別人的程式碼

Go語言中的效能測試與單元測試的差異 Go語言中的效能測試與單元測試的差異 May 08, 2024 pm 03:09 PM

Go語言中的效能測試與單元測試的差異

Golang技術在設計分散式系統時應注意哪些陷阱? Golang技術在設計分散式系統時應注意哪些陷阱? May 07, 2024 pm 12:39 PM

Golang技術在設計分散式系統時應注意哪些陷阱?

Golang技術在機器學習中使用的函式庫和工具 Golang技術在機器學習中使用的函式庫和工具 May 08, 2024 pm 09:42 PM

Golang技術在機器學習中使用的函式庫和工具

Java函數中遞歸呼叫的調試技巧有哪些? Java函數中遞歸呼叫的調試技巧有哪些? May 05, 2024 am 10:48 AM

Java函數中遞歸呼叫的調試技巧有哪些?

Golang技術在行動物聯網開發中的作用 Golang技術在行動物聯網開發中的作用 May 09, 2024 pm 03:51 PM

Golang技術在行動物聯網開發中的作用

See all articles