在下面的代码中:
package main
type RationalNumber struct {
x int
y int
}
type Numerator int
type Denominator int
// Constructor
func newRational(n, d int) RationalNumber {
g := gcd(n, d)
return RationalNumber{
x: n / g,
y: d / g,
}
}
// Selector
func (r RationalNumber) numer() Numerator {
return r.x
}
func (r RationalNumber) denom() Denominator {
return r.y
}
func main() {
}
func gcd(a int, b int) int { // (15, 21) (-15, 21) (15, -21) (-15, -21)
var f func(int, int) int
f = func(x int, y int) int {
if x%y == 0 {
return y
}
return gcd(y, x%y)
}
if mod(a) < mod(b) {
return f(mod(b), mod(a))
}
return f(mod(a), mod(b))
}
func mod(x int) int { // helper
if x < 0 {
return -x
}
return x
}
标识符
Numerator
的底层类型是int
。 r.x
属于类型 int
那么,为什么
return r.x
会出错呢? cannot use r.x (variable of type int) as Numerator value in return statement
那么,为什么 return r.x 会出错呢?不能使用 r.x(int 类型的变量)作为 return 语句中的分子值
因为虽然底层类型相同,但类型不同。返回时只需转换为底层类型:
return r.x.(Numerator)