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 回复

你需要使用 math.IsNaN() 来检查某个值是否是非数字。

更多关于Golang为什么这段代码不生效的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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情况。主要问题在于:

  1. 类型断言错误:你试图将float64断言为string,但输入参数已经是float64类型
  2. NaN检测缺失:没有专门检测NaN值的逻辑
  3. 浮点数相等比较:直接使用==比较浮点数可能因精度问题失败

以下是修复后的代码:

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

主要修改:

  1. 移除了不必要的map和类型断言逻辑
  2. 使用math.IsNaN()检测NaN值
  3. 使用容差值比较浮点数相等,避免精度问题
  4. 简化了三角形类型判断逻辑
  5. 修正了三角形不等式检查(使用<=而不是<

这样就能正确处理NaN、0、负数以及各种三角形类型的情况了。

回到顶部