首页 > 解决方案 > 如何检查是否已设置 int 变量?

问题描述

可以说我有一个变量num

在评估if语句之前,我需要首先检查是否已设置此变量。通常我会使用其中一个-10或者math.MaxInt32/math.MinInt32但是对于这个任务,我需要检查我的程序是否设置了它的值。

我试过nums := nil了,在我的if陈述中我有类似的东西if nums == nil || ...

但是在创建nums变量时,我惊讶地发现错误cannot convert nil to type int。我怎样才能实现我想做的事情?

说清楚:这是一个 leetcode问题,无法控制输入,他们将各种数字放入其中,包括 math.MaxInt32、math.MinInt32

完整代码:

func thirdMax(nums []int) int {

    dict := make(map[int]int, 0)

    varmaxOne := math.MinInt32
    maxTwo := math.MinInt32
    maxThree := math.MinInt32


    for _, value := range nums {

        if value >= maxOne && dict[value] < 1 {

            maxThree = maxTwo
            maxTwo = maxOne
            maxOne = value

        }else if value >= maxTwo && dict[value] < 1{
            maxThree = maxTwo
            maxTwo = value
        } else if value >= maxThree && dict[value] < 1 {
            maxThree = value
        }

        dict[value] += 1
    }

    if maxThree == math.MinInt32 {
        return maxTwo
    }
    return maxThree

}

func max(a int, b int) int {
    if a > b {
        return a
    }
    return b
}

测试

func TestThirdMax(t *testing.T) {
    //array := []int{2, 3, -1, -9, 11, 4, 3, 0, -100}
    //array := []int{2, 2, 3, 1}
    array := []int{1,2,-2147483648}
    //array := []int{3,2,1}
    result := thirdMax(array)

    if result != 2 {
        t.Errorf("Expected 2, but it was %d instead.", array)
    }
}

上面的代码使用math.MinInt32,但由于给定的输入而失败。这个想法是nil改为在语句中进行检查if,但如上所述失败。

标签: go

解决方案


正如评论所暗示的,Go 中所有 int 类型的零值是0. 如果0是一个数字的可能值,并且您需要检查它是否已分配,那么您可能希望使用附加了一些元数据的 Struct 类型,而不是原始类型。

像往常一样,这些问题在标准库中有这样的先例。

看一下 database/sql 包的 Null 类型。 这些类型也可以通过实现来证明Scanner,但是您可以在需要检查原始值是否真正等于 Null 而不是零值时使用相同的想法。


推荐阅读