我尝试构建一个区块链项目时,遇到了一个关于gob Serialize的问题。我有一个使用elliptic.P256()Curve结构的结构钱包,当我尝试序列化钱包时,出现了一个没有导出字段的bug。
真希望能得到一些帮助。
这就是我的准则。
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
3条答案
按热度按时间2w2cym1i1#
将您的Go版本更改为1.18.10,价格更低。由于最新的Go版本,即1.19.5,我遇到了同样的问题
我们需要用老方法来降级Go语言的版本,因为Go语言没有提供任何类似于高级版本管理器的东西。
降级Go版本的步骤:
1.卸载现有Go版本
要卸载Go,请找到Go在系统中的位置。
$where go
此命令将在用户路径中定位程序文件。要卸载,请删除
/usr/local/go
目录或在上一个命令中作为输出收到的源目录。使用命令$ sudo rm -rf /usr/local/go
删除Go目录。为了确认运行命令
$ go version
,如果您已成功删除Go目录,系统将提示 “未找到命令go”。1.安装新版本
进入downloads页面,下载与你的操作系统和架构兼容的版本发布(选择installer而不是Archive来简化操作),解压缩并解压安装包,新的Go版本就安装到你的系统中了。
之后,您需要重启终端才能使修改生效。要检查Go是否安装成功,请运行命令
$go version
。该命令会打印Go的安装版本。还要确保GOROOT
和GOPATH
没有修改。ghhkc1vu2#
这里你似乎要做的是从
crypto/elliptic
包中序列化一条P256曲线,问题是P256()
函数返回一个名为elliptic.Curve
的接口。这个错误告诉你的是
elliptic.Curve
的底层类型,在这里是elliptic.p256Curve
,没有导出的字段(以首字母大写命名),encoding/gob
使用的Go语言的reflect
包只对导出的字段有效。您可能希望尝试使用
crypto/elliptic
的Marshal()
或GenerateKey()
函数。yqlxgs2m3#
这个问题在Go语言的1.9.* 版本中出现。例如,安装1.8.7就可以了。安装之后一切都会正常工作。)