go - 如何检查是否已设置 int 变量?
问题描述
可以说我有一个变量num
。
在评估if
语句之前,我需要首先检查是否已设置此变量。通常我会使用其中一个-1
,0
或者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 中所有 int 类型的零值是0
. 如果0
是一个数字的可能值,并且您需要检查它是否已分配,那么您可能希望使用附加了一些元数据的 Struct 类型,而不是原始类型。
像往常一样,这些问题在标准库中有这样的先例。
看一下 database/sql 包的 Null 类型。 这些类型也可以通过实现来证明Scanner
,但是您可以在需要检查原始值是否真正等于 Null 而不是零值时使用相同的想法。
推荐阅读
- python - TypeError:“模块”对象不可调用py 3
- google-chrome - 网站上的小写文本仅在 Chrome 浏览器上显示为大写
- javascript - 使用 props 访问带有点符号的对象
- typescript - Ionic Project 适用于本地的 heroku,但不适用于网络
- winforms - .NET Windows 窗体 - 与从 webview2 打开的网站文件对话框交互
- object - 在现有对象中添加新对象的函数
- django-rest-framework - 如何使用 Django REST 框架/django 过滤器将可用的过滤器选项传达给前端?
- windows - 在哪里可以找到 CIM 实例中的 Windows 版本?
- javascript - Angular Material Date Picker无法读取underfined的属性
- ruby - 用 Ruby 解决插入排序时整数与 nil 的比较失败 (ArgumentError)