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标志,告诉哪个返回值是有效的。


以上是Golangreturn或float或complex的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>