通常在使用 go 時,不知道為什么,我有寫類似的沖動
type data []event
尤其是當我知道我將在沒有過多考慮程式大部分內容的情況下傳遞切片時。遲早是時候將一些資料解壓縮到那段事件中,我最終會寫如下內容:
func (d *data)Unmarshal(b []byte){
//... lots of sad code that never works
}
無論我做什么,我都無法完全弄清楚如何使用一種將一些位元組data就地轉換為型別的解組方法來祝福我的切片型別。
當我放棄時,我要么寫一個更簡單的函式func UnmarshalData(b []byte) data,比如感覺像是退卻,讓撰寫介面變得困難,要么首先更改型別并制作一個類似的結構
type data struct {
actuallyTheData []event
}
這純粹是為了彌補我缺乏理解的樣板。
所以我的問題是:是否可以使用指標接收器撰寫一個函式,其中接收器是切片型別,并且允許我就地解組?
我能得到的最接近的,雖然它仍然不起作用(而且,讓我們面對現實,非常丑陋),是這樣的:
type foo []int
func (f *foo) Unmarshal(s string) {
numbers := strings.Split(s, ",")
integers := make([]int, len(numbers))
for i, n := range numbers {
integer, err := strconv.Atoi(n)
if err != nil {
log.Fatal(err)
}
integers[i] = integer
}
my_f := foo(integers)
f = &my_f
}
這是完整的示例:https ://go.dev/play/p/3q7qehoW9tm 。為什么它不起作用?我有什么誤解?
uj5u.com熱心網友回復:
函式的最后一行Unmarshal是覆寫接收器本身,即它的地址:
f = &my_f // changing the value of the pointer
更新后的值不會傳播給callers。從宣告和范圍:
表示方法接收器、函式引數或結果變數的識別符號的范圍是函式體。
您必須改變指向的值,然后呼叫者將在取消參考時看到它。(事實上??,您不必轉換為定義的切片型別)
func (f *foo) Unmarshal(s string) {
// ...
integers := make([]int, len(numbers))
*f = integers
}
固定游樂場:https ://go.dev/play/p/3JayxQMClt-
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414535.html
標籤:
上一篇:如何從讀取檔案中回傳陣列?
