关于golang的for循环语法问题疑惑

新手上路,请多包涵
func longestConsecutive(nums []int) int {
    type Set map[int]struct{}
    // numsSet := map[int]struct{}
    numsSet := make(Set)
    for _, num := range nums {
        numsSet[num] = struct{}{}
    }
    res := 0
    for num := range numsSet {
        if  _, ok := numsSet[num-1]; ok {
            curNum := num
            curRes := 1
            for _, ok := numsSet[curNum+1]; ok {
                curNum++
                curRes++
            }
            if curRes > res {
                res = curRes
            }
        }
    }
    return res
}

两点疑问:

  1. numsSet := map[int]struct{} 为什么无法编译,必须以下写法才能运行
    type Set map[int]struct{}
    numsSet := make(Set)
  2. for _, ok := numsSet[curNum+1]; ok {
                 curNum++
                 curRes++
             }

    这里for循环遍历无法编译,正确写法是什么?改成下面写法可以运行,能不能合成一句?

    for {
                 if _, ok := numsSet[curNum+1]; ok{
                     curNum++
                     curRes++
                 } else if !ok {
                     break
                 }
      }
阅读 1.2k
1 个回答
  1. numsSet := map[int]struct{} 不能编译,因为 map[int]struct{} 是类型而不是字面量。其中int是键类型,struct{}是值类型。可以改为numsSet := map[int]struct{}{}
  2. 可以,但没什么意义,也不好读。本质就是改成了 do while 形式。
for _, ok := numsSet[curNum]; ok; {
        curNum++
        curRes++
        _, ok = numsSet[curNum]
    }

go 的 for 语法形式中没有类似 if 的特殊写法。

  • for {}
  • for i := 0 ; i < 10; i++ {}
  • for i := range make(chan int, 1) {}
  • for k,v := range map[int]int{} {}
  • for idx, v := range []int{1,2,3} {}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题