簡體   English   中英

從另一個包擴展結構時非導出字段

[英]non exported fields when extending a struct from another package

我在一個小型玩具項目中使用go-simplejson (實際上是我的第一個go項目)。 在這個項目中,我需要擴展simplejson包:

simplejson通過構造函數引入了一個小的結構(帶有一些有用的方法):

type Json struct {
    data interface{}
}

// NewJson returns a pointer to a new `Json` object
// after unmarshaling `body` bytes
func NewJson(body []byte) (*Json, error) {
    j := new(Json)
    err := j.UnmarshalJSON(body)
    if err != nil {
        return nil, err
    }
    return j, nil
}

在我的項目中,我想將一些xml數據同步到CouchDB。 為此,我希望創建一個新的構造函數,在該構造函數中,將解碼后的xml(類型interface {})直接傳遞到Json對象,然后將其編組為JSON。

這很簡單:

func NewJsonFromData(data interface{}) *Json {
    return &Json{data}
}

現在,由於這是某種“ hack”,我想避免分叉go-simplejson並在go-simplejson中實現它,因為我會“污染”一般的包裝。 我想用自己的小玩具包來做。 這是麻煩開始的地方:

數據字段未導出並且在包外部不可見...因此將此函數聲明放入我的其他包中,如下所示:

func NewJsonFromData(data interface{}) *simplejson.Json {
    return &simplejson.Json{data}
}

不起作用,它給出以下編譯錯誤:

implicit assignment of unexported field 'data' in simplejson.Json literal

也做

type Json struct {
    simplejson.Json
}

在我自己的包中不起作用,我無法在組成simplejson.Json的我自己的Json結構的構造函數中設置數據字段,因為未導出(顯然,如果將該字段稱為“ Data”,它將起作用。

在我自己的包文件夾中制作一個文件

package simplejson

不接受,因為go會強制您將軟件包的所有文件保存在一個文件夾中。

  1. 如果開發人員決定不導出結構字段,那么擴展包功能根本不可能是正確的嗎? (另一方面,我想這樣做的原因是,我想這樣做,因為它“僅”是一個玩具示例:))

  2. 如果可能的話,最好的方法是什么?

在所有語言中都是如此,私有字段在其范圍之外不可訪問。

話雖這么說,如果您已經有了接口,為什么不使用標准的JSON庫,該庫具有編組函數,該函數直接使用接口即可,而不必設置為字段。

package main

import (
    "encoding/json"
)

func main() {
    v := ....
    jsonBytes, err := json.Marshal(v)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM