当我发现一个关于gob序列化的问题时,我正在尝试构建一个块链项目。我有一个使用elliptic.P256()曲线结构的struct,当我试图序列化Wallet时,没有导出字段的错误发生了。
真希望能帮上忙。
这是我的密码。
const walletFile = "Wallets.dat"
type Wallets struct {
WalletsMap map[string]*Wallet
}
type Wallet struct {
PrivateKey ecdsa.PrivateKey
PublicKey []byte
}
func (w *Wallets) SaveWallets() {
var content bytes.Buffer
gob.Register(elliptic.P256())
encoder := gob.NewEncoder(&content)
err := encoder.Encode(&w)
if err != nil {
log.Panic(err)
}
err = ioutil.WriteFile(walletFile, content.Bytes(), 0644)
if err != nil {
log.Panic(err)
}
}
func NewWallets() (*Wallets, error) {
if _, err := os.Stat(walletFile); os.IsNotExist(err) {
wallets := &Wallets{}
wallets.WalletsMap = make(map[string]*Wallet)
return wallets, err
}
fileContent, err := ioutil.ReadFile(walletFile)
if err != nil {
log.Panic(err)
}
var wallets Wallets
gob.Register(elliptic.P256())
decoder := gob.NewDecoder(bytes.NewReader(fileContent))
err = decoder.Decode(&wallets)
if err != nil {
log.Panic(err)
}
return &wallets, nil
}问题
2022/09/18 19:42:33 gob: type elliptic.p256Curve has no exported fields
panic: gob: type elliptic.p256Curve has no exported fields发布于 2022-09-20 21:35:27
您在这里似乎要做的是从P256包序列化一条crypto/elliptic曲线。问题是P256()函数返回一个名为elliptic.Curve的接口。
此错误告诉您的是,elliptic.Curve的基础类型(在本例中为elliptic.p256Curve )没有导出的任何字段(用第一个字母大写命名)。Go的reflect包( encoding/gob使用的)只适用于导出的字段。
您可能想尝试使用crypto/elliptic的Marshal()或GenerateKey()函数。
发布于 2022-10-08 13:15:26
它的问题在1.9.*版本的Go。例如,只需安装1.8.7。之后一切都会好起来的)
https://stackoverflow.com/questions/73762677
复制相似问题