golang中的变量你知道多少?

变量的定义

var a =1//编译器会推断变量 a的类型为int
b :=1 //短变量声明
var c int;c=1// 变量声明,并且赋值

变量的重声明

短变量声明。通过使用它,我们可以对同一个代码块中的变量进行重声明。

例子

var err error
n, err := io.WriteString(os.Stdout, "Hello\n")//使用短变量声明对新变量n和旧变量err进行了“声明并赋值”,这也是对后者的重声明

变量重声明的前提条件

  1. 由于变量的类型在其初始化时就已经确定了,所以对它再次声明时赋予的类型必须与其原本
    的类型相同,否则会产生编译错误。
  2. 变量的重声明只可能发生在某一个代码块中。如果与当前的变量重名的是外层代码块中的变
    量,那么就是可重名变量了。
  3. 变量的重声明只有在使用短变量声明时才会发生,否则也无法通过编译。如果要在此处声明
    全新的变量,那么就应该使用包含关键字var的声明语句,但是这时就不能与同一个代码块
    中的任何变量有重名了 。
  4. 被“声明并赋值”的变量必须是多个,并且其中至少有一个是新的变量。这时我们才可以说
    对其中的旧变量进行了重声明。

可重名变量

例子:

package main

import (
    "fmt"
)

var str = "我在main外面"

func main() {
    var str = "我在main里面"
    {
        str := "我在代码块内"
        fmt.Println(str)
    }
    fmt.Println(str)
}
//输出的结果
//我在代码块内
//我在main里面

变量的查找:

  • 首先,代码引用变量的时候总会最优先查找当前代码块中的那个变量。注意,这里的“当前
    代码块”仅仅是引用变量的代码所在的那个代码块,并不包含任何子代码块。

  • 其次,如果当前代码块中没有声明以此为名的变量,那么程序会沿着代码块的嵌套关系,从
    直接包含当前代码块的那个代码块开始,一层一层地查找。

  • 一般情况下,程序会一直查到当前代码包代表的那层代码块。如果仍然找不到,那么 Go 语
    言的编译器就会报错了。

  • 如果我们把代码包导入语句写成import . XXX的形式,那么就会让这个“XXX”包中公开的程序实体被当前源码文件中的代码,视为当前代码包中的程序实体。在查找当前源码文件不存在后,会查用这种方式导入的代码包

重名变量与变量重声明中的变量区别

  1. 变量重声明中的变量一定是在某一个代码块内的。注意,这里的“某一个代码块内”并不包
    含它的任何子代码块,否则就变成了“多个代码块之间”。而重名变量指的正是在多个代
    码块之间的由相同的标识符代表的变量。
  2. 变量重声明是对同一个变量的多次声明,这里的变量只有一个。而重名变量中涉及的变量
    肯定是有多个的。
  3. 不论对变量重声明多少次,其类型必须始终一致,具体遵从它第一次被声明时给定的类型。
    重名变量之间不存在类似的限制,它们的类型可以是任意的。
  4. 如果重名变量所在的代码块之间存在直接或间接的嵌套关系,那么它们之间一定会存
    在“屏蔽”的现象。但是这种现象绝对不会在变量重声明的场景下出现。

判断变量的类型

语法:

/*
  类型断言表达式的语法形式是x.(T)。其中的x代表要被判断类型的那个值。这
  个值当下的类型必须是接口类型的
*/
container := []string{"111", "222"}
// 需要将 container 转成接口类型,才可以使用类型推断(如果不是接口,那类型推断又有什么必要了)
value, ok := interface{}(container).([]string
/*
ok:将代表类型判断的结果bool类型
value:
    ok=true:被判断的值将会被自动转换为[]string类型的值,并赋给变量value
    ok=false:value将被赋予nil
*/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,310评论 0 5
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,204评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,037评论 0 21