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

参见 https://play.golang.org/p/Q-wFaLUN7ep

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

Go Playground - The Go Programming Language

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

关键点:

  1. koreanAge := age + 2 是 if 语句的初始化语句,其作用域仅限于该 if 语句
  2. 当传入 age = 16 时,koreanAge = 18
  3. 条件 koreanAge < 18 判断为 false
  4. 执行 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
}
回到顶部