gpt4 book ai didi

Go错误检查和链接

转载 作者:IT王子 更新时间:2023-10-29 01:52:03 24 4
gpt4 key购买 nike

package main

import (
"errors"
"fmt"
)

type FieldElement struct {
Num int
Prime int
}

func (el *FieldElement) Add(o FieldElement) (FieldElement, error) {
if el.Prime != o.Prime {
return FieldElement{}, errors.New("cannot operate on two numbers in different Fields")
}
return FieldElement{(el.Num + o.Num) % el.Prime, el.Prime}, nil
}

// Sub, Mul, Div and Pow also members of FieldElement returning (FieldElement, error)

func main() {
a := FieldElement{13, 19}
b := FieldElement{9, 19}
fmt.Println(a.Add(b))
}

type Point struct {
X FieldElement
Y FieldElement
A FieldElement
B FieldElement
}

现在在 Point 创建时,我想检查一个点是否在定义为 y^2 = x^3 + ax + b 的曲线上

FieldElement的每次操作返回2个值以满足错误检查。

所以我做不到

x.Pow(3).Add(a.Mul(x)).Add(b)

最后是

pow3, e1 := x.Pow(three)
mul, e2 := a.Mul(x)
add, e3 := pow3.Add(mul)
rval, e4 := add.Add(b)
// check that y^2 == rval

这使得代码难以理解,golang 的正确做法是什么?

playground

最佳答案

让你的方法只返回一个值,这样它们就可以被链接起来,并将错误值存储在返回值中,以供之后检查。示例:

type FieldElement struct {
Num int
Prime int
Error error
}

func (el *FieldElement) Add(o FieldElement) *FieldElement {
if el.Error != nil {
// An error already happened, so do nothing
return el
}
if el.Prime != o.Prime {
el.Error = errors.New("cannot operate on two numbers in different Fields")
} else {
el.Num = (el.Num + o.Num) & el.Prime
}
return el
}

然后像这样使用它:

    x.Add(...).Mul(...).Sub(...) // etc
if x.Error != nil {
// handle error here
}

关于Go错误检查和链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50136113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com