Golang返回或浮动或复杂



我正在尝试编写一个三次方程求解器。

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

输出是相同的。在围棋场上试试这个。

上述解决方案是可能的,因为实数是复数的子集。在一般情况下,您可以使用多个返回值,每个值都是一个指针,您可以检查哪个返回值不是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标志,告诉哪个返回值是有效的。

最新更新