Golangreturn或float或complex
我正在尝试编写一个三次方程求解器。
func (a,b,c,d float64) (returnType,err){
if a<0{
return complex, nil
}
if a>=0 {
return float64, nil
}
}
有没有办法返回和接口或管理这种行为?
回答
由于实数(浮点数)是复数的一个子集,您可以选择始终返回一个复数,而在您只返回的地方float64,您留下虚部0:
func abcd(a, b, c, d float64) (complex128, error) {
if a < 0 {
r, j := 1.0, 2.0
return complex(r, j), nil
}
if a >= 0 {
r := 3.0
return complex(r, 0), nil
}
return 0 + 0i, nil
}
测试它:
c, err := abcd(1, 0, 0, 0)
fmt.Println(c, err)
if imag(c) == 0 {
fmt.Println("treal:", real(c))
}
c, err = abcd(-1, 0, 0, 0)
fmt.Println(c, err)
if imag(c) == 0 {
fmt.Println("treal:", real(c))
}
哪些输出(在Go Playground上试试):
(3+0i) <nil>
real: 3
(1+2i) <nil>
是的,如果将返回一个复数,其虚部为0,则您无法将这种特殊情况与仅返回实数的情况区分开来。也许你不必?如果没有,这不是问题。如果您确实需要区分它们,您还可以返回第三个值,告诉结果是否实际上是一个复数:
func abcd(a, b, c, d float64) (x complex128, isComplex bool, err error) {
if a < 0 {
r, j := 1.0, 2.0
return complex(r, j), true, nil
}
if a >= 0 {
r := 3.0
return complex(r, 0), false, nil
}
return 0 + 0i, false, nil
}
测试它:
c, isC, err := abcd(1, 0, 0, 0)
fmt.Println(c, isC, err)
if !isC {
fmt.Println("treal:", real(c))
}
c, isC, err = abcd(-1, 0, 0, 0)
fmt.Println(c, err)
if !isC {
fmt.Println("treal:", real(c))
}
输出是一样的。在Go Playground上试试这个。
上述解决方案是可能的,因为实数是复数的子集。在一般情况下,您可以使用多个返回值,每个返回值都是一个指针,您可以检查哪个返回值不是nil。像这样的东西:
func abcd(a, b, c, d float64) (*complex128, *float64, error) {
if a < 0 {
r, j := 1.0, 2.0
x = :complex(r, j)
return &x, nil, nil
}
if a >= 0 {
f := 3.0
return nil, &f, nil
}
return nil, nil, nil
}
测试它:
c, f, err := abcd(1, 0, 0, 0)
fmt.Println(c, f, err)
if c != nil {
fmt.Println("tcmplx:", *c)
}
if f != nil {
fmt.Println("treal:", *f)
}
c, f, err = abcd(-1, 0, 0, 0)
fmt.Println(c, f, err)
if c != nil {
fmt.Println("tcmplx:", *c)
}
if f != nil {
fmt.Println("treal:", *f)
}
输出(在Go Playground上试试):
<nil> 0xc000018050 <nil>
real: 3
0xc000018070 <nil> <nil>
cmplx: (1+2i)
你也可以结合最后两个解决方案:你可以返回非指针和一个isComplex标志,告诉哪个返回值是有效的。