Golang为什么这段代码不生效
Golang为什么这段代码不生效 大家好,想知道为什么类型转换不起作用
在3、4、NaN情况下失败
type Kind int
const (
NaT Kind = iota + 1 // not a triangle
Equ // all sides equal
Iso // two sides equal
Sca // all sides different
)
func KindFromSides(a, b, c float64) Kind {
ma := map[int]interface{}{
1: a,
2: b,
3: c,
}
for i := 1; i <= 3; i++ {
if _, ok := ma[i].(string); ok {
return NaT
}
}
if a <= 0 || b <= 0 || c <= 0 {
return NaT
}
if (a+b+c)/3 == a {
if (a+b+c)/3 == b {
if (a+b+c)/3 == c {
return Equ
}
}
}
if a+b < c || b+c < a || c+a < b {
return NaT
}
if a == b || b == c || c == a {
return Iso
}
return Sca
}
更多关于Golang为什么这段代码不生效的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
func main() {
fmt.Println("hello world")
}
当用户输入(3, 4, NaN)等无效输入时,尝试返回NaT
非常感谢
for i := 1; i <= 3; i++ {
if b1 := math.IsNaN(ma[i].(float64)); b1 {
return NaT
}
if b2 := math.IsInf(ma[i].(float64), 0); b2 {
return NaT
}
}
你的代码有几个问题导致类型转换不起作用,并且无法正确处理NaN情况。主要问题在于:
- 类型断言错误:你试图将float64断言为string,但输入参数已经是float64类型
- NaN检测缺失:没有专门检测NaN值的逻辑
- 浮点数相等比较:直接使用
==比较浮点数可能因精度问题失败
以下是修复后的代码:
package main
import (
"math"
)
type Kind int
const (
NaT Kind = iota + 1 // not a triangle
Equ // all sides equal
Iso // two sides equal
Sca // all sides different
)
func KindFromSides(a, b, c float64) Kind {
// 检测NaN值
if math.IsNaN(a) || math.IsNaN(b) || math.IsNaN(c) {
return NaT
}
// 检测非正数
if a <= 0 || b <= 0 || c <= 0 {
return NaT
}
// 检测三角形不等式
if a+b <= c || b+c <= a || c+a <= b {
return NaT
}
// 使用容差比较浮点数相等
const epsilon = 1e-9
equal := func(x, y float64) bool {
return math.Abs(x-y) < epsilon
}
// 检查等边三角形
if equal(a, b) && equal(b, c) {
return Equ
}
// 检查等腰三角形
if equal(a, b) || equal(b, c) || equal(c, a) {
return Iso
}
return Sca
}
// 测试示例
func main() {
// 测试NaN情况
println(KindFromSides(math.NaN(), 2, 3)) // 输出: 1 (NaT)
// 测试正常情况
println(KindFromSides(2, 2, 2)) // 输出: 2 (Equ)
println(KindFromSides(2, 2, 3)) // 输出: 3 (Iso)
println(KindFromSides(2, 3, 4)) // 输出: 4 (Sca)
// 测试非法三角形
println(KindFromSides(1, 1, 3)) // 输出: 1 (NaT)
}
主要修改:
- 移除了不必要的map和类型断言逻辑
- 使用
math.IsNaN()检测NaN值 - 使用容差值比较浮点数相等,避免精度问题
- 简化了三角形类型判断逻辑
- 修正了三角形不等式检查(使用
<=而不是<)
这样就能正确处理NaN、0、负数以及各种三角形类型的情况了。


