猿问

恐慌:采空区:类型 elliptic.p256Curve 没有导出字段

当我遇到有关 gob Serialize 的问题时,我正在尝试构建一个区块链项目。我有一个使用 elliptic.P256() Curve 结构的结构钱包,当我尝试序列化钱包时,出现了没有导出字段的错误。


真的希望得到一些帮助。


有我的代码。


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


湖上湖
浏览 334回答 3
3回答

qq_笑_17

将您的 Go 版本更改为1.18.10 for less。由于最新的 Go 版本,即 1.19.5,我遇到了同样的问题我们需要以旧方式降级 Go 版本,因为 Go 不提供像花哨的版本管理器这样的东西。降级Go版本的步骤:卸载现有的 Go 版本要卸载 Go,请找到 Go 在您系统上的位置。$where go此命令将在用户路径中定位程序文件。要卸载,请删除/usr/local/go您在上一个命令中作为输出收到的目录或源目录。使用命令$ sudo rm -rf /usr/local/go删除Go目录。确认运行命令,如果成功删除Go目录,$ go version系统会提示“command go not found” 。安装新版本转到下载页面并下载与您的操作系统和体系结构兼容的版本发布(选择安装程序而不是存档以方便您自己使用)。解压缩并解压缩软件包安装程序,新的 Go 版本现在已安装在您的系统中。之后,您需要重新启动终端才能使更改生效。要检查您是否已成功安装 Go,请运行命令$go version。该命令打印已安装的 Go 版本。还要确保GOROOT并且GOPATH没有改变。

杨__羊羊

您在这里似乎想做的是序列化包中的 P256 曲线crypto/elliptic。问题是该P256()函数返回一个名为elliptic.Curve.此错误告诉您的是 的基础类型elliptic.Curve(在本例中为elliptic.p256Curve)没有任何导出的字段(以首字母大写命名)。使用的Goreflect包encoding/gob仅适用于导出的字段。您可能想尝试使用crypto/elliptic或Marshal()函数GenerateKey()。

慕的地10843

它在 Go 的 1.9.* 版本中存在问题。例如,只需安装 1.8.7。一切都会在这之后正常工作)
随时随地看视频慕课网APP

相关分类

Go
我要回答