Golang中为什么结果为true?
Golang中为什么结果为true?
package main
import "fmt"
func canidrink(age int) bool {
if koreanAge := age + 2; koreanAge < 18 {
return false
}
return true
}
func main() {
fmt.Println(canidrink(16))
}
7 回复
petrus:
这行不通
这可能是一个反对在此处使用 unit 的理由。但我的观点是使用一个特定的类型。
更多关于Golang中为什么结果为true?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
感谢 我已修复条件判断
func canidrink(age int) bool {
if koreanAge := age + 2; koreanAge < 19 {
return false
}
return true
当你将16传递给canidrink时,年龄是16,加上2之后,koreanAge = 18,这个值不小于18,而是等于18,因此if子句不会执行,程序会进入else子句……
或者你也可以这样做:
func canIDrinkInKorea(age int) bool {
if koreanAge := age + 2; koreanAge <= 18 {
return false
}
return true
}
注意小于等于符号 <=。这样可读性稍好一些,因为你想比较的是 18,而不是 19。
这可以在不使用魔法数字的情况下更简洁地编写,同时保持类型安全。
type age uint
const legalDrinkingAgeInKorea age = 16
func canIDrinkInKorea(theAge age) bool {
// 这里没有魔法数字!
return theAge > legalDrinkingAgeInKorea
}
使用 age 类型可以防止传递一个非年龄的 int。以下代码将无法编译:
var currentYear = 2020
fmt.Println(canIDrinkInKorea(currentYear))
使用
age类型可以防止传递一个非年龄的int值。
人们不使用无符号整数类型来验证整数域的范围是有原因的。它不起作用。
package main
import (
"fmt"
"math"
)
type Age uint
const legalDrinkingAgeInKorea Age = 16
func canIDrinkInKorea(theAge Age) bool {
return theAge > legalDrinkingAgeInKorea
}
func main() {
for _, age := range []int{
-1, 0, 15, 16, 17, 18, 19, math.MaxInt32, math.MinInt32,
} {
fmt.Println(age, canIDrinkInKorea(Age(age)))
}
}
-1 true
0 false
15 false
16 false
17 true
18 true
19 true
2147483647 true
-2147483648 true
这段代码返回 true 是因为变量作用域和条件判断的逻辑问题。具体分析如下:
package main
import "fmt"
func canidrink(age int) bool {
// koreanAge 的作用域仅限于当前 if 语句块
if koreanAge := age + 2; koreanAge < 18 {
return false
}
// 当 age = 16 时:
// koreanAge = 16 + 2 = 18
// 条件 koreanAge < 18 为 false(18 < 18 不成立)
// 因此执行这里的 return true
return true
}
func main() {
fmt.Println(canidrink(16)) // 输出: true
}
关键点:
koreanAge := age + 2是 if 语句的初始化语句,其作用域仅限于该 if 语句- 当传入
age = 16时,koreanAge = 18 - 条件
koreanAge < 18判断为false - 执行 if 语句块外的
return true
如果想要年龄小于18时返回false,可以这样修改:
func canidrink(age int) bool {
koreanAge := age + 2
if koreanAge < 18 {
return false
}
return true
}
或者更简洁的写法:
func canidrink(age int) bool {
return age + 2 >= 18
}


