Здесь вступает Apache Thrift tutorial for Go. Учебник состоит из small service:
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
struct Work {
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
service Calculator extends shared.SharedService {
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
// some other methods ...
}
Если клиент проходит операцию расчета на сервер таким образом:
work := tutorial.NewWork()
work.Op = tutorial.Operation_DIVIDE
work.Num1 = 1
work.Num2 = 0
quotient, err := client.Calculate(1, work)
if err != nil {
switch v := err.(type) {
case *tutorial.InvalidOperation:
fmt.Println("Invalid operation:", v)
default:
fmt.Println("Error during operation:", err)
}
return err
} else {
fmt.Println("Whoa we can divide by 0 with new value:", quotient)
}
сервер должен бросить исключение, как показано ниже. Нечто подобное происходит, когда какое-то неизвестное значение для w.Op
передается:
func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32, err error) {
switch w.Op {
case tutorial.Operation_DIVIDE:
if w.Num2 == 0 {
ouch := tutorial.NewInvalidOperation()
ouch.WhatOp = int32(w.Op)
ouch.Why = "Cannot divide by 0"
err = ouch
return
}
val = w.Num1/w.Num2
break
// other cases omitted
default:
ouch := tutorial.NewInvalidOperation()
ouch.WhatOp = int32(w.Op)
ouch.Why = "Unknown operation"
err = ouch
return
}
// more stuff omitted
}