Перейти проверка ошибок и цепочки - PullRequest
0 голосов
/ 02 мая 2018
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 

Из-за этого трудно следовать коду, как правильно это сделать?

детская площадка

1 Ответ

0 голосов
/ 02 мая 2018

Заставьте ваши методы возвращать только одно значение, чтобы их можно было объединить в цепочку и сохранить значение ошибки в этом возвращаемом значении для проверки после. Пример:

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
    }
...