Go语言变量定义,每省略一次声明,就会刨一个坑

蚂蚁捉虫虫 · · 572 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在Go语言中,变量可以声明之后再赋值,也可以不声明,直接就用。

var strM string
strM = "Hello Golang"

strN := "Hello Golang"

我刚开始的时候有点困惑,一把锁为什么要配两把钥匙,使用一种方法不就香吗?

知道刚才,我碰到一个问题,才发现Golang定义这两种方式,真的很香。

package main

import "fmt"

func main() {
    n := map[string]int{
        "n1":1,
        "n2":2,
    }
    
    if k, ok := n["n2"];ok{
        fmt.Println(k," is there")
        fmt.Println(ok)
    }else{
        fmt.Print(k," is NOT there")
    }
    
    fmt.Println(ok)
}

程序运行的结果会出错。

# command-line-arguments
./main.go:18:14: undefined: ok

在if那里,不是已经定义了变量ok吗,为什么后面打印的时候会报错呢?
这是因为在go语言里,有一种范围叫做语义(context),这个变量是在if语句里直接赋值使用的,没有实现声明,它的作用域仅仅局限在if这个语义之下,超出if语句就不起作用了。

现在我把它先声明一下。

package main

import "fmt"

func main() {
    n := map[string]int{
        "n1":1,
        "n2":2,
    }
    
    var ok bool //ok is declared
    var k int
    
    if k, ok = n["n2"];ok{
        fmt.Println(k," is there")
        fmt.Println(ok)
    }else{
        fmt.Print(k," is NOT there")
    }
    
    fmt.Println(ok)
}

运行的结果是:

2  is there
true
true

这是我初次在简书里面写代码块,看到别人的文章里,代码块都是带行号的,折腾了半天我也弄不出来,谁能告诉我一下,应该需要怎么做?


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:蚂蚁捉虫虫

查看原文:Go语言变量定义,每省略一次声明,就会刨一个坑

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

572 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传