Golang 申明变量主要有三种方式:
一是使用 var 关键字,申明包级或函数级变量;
二是使用短变量申明方式,只能申明函数级变量,且需指明变量初始值;
三是使用 const 关键字,申明包级或函数级常量。

1.var

var 用于申明函数级变量和包级变量。

var name T                           // 指明类型,使用类型零值
var name T = value                 // 指明类型,指明初始值
var name0, name1 T                  // 指明类型,使用类型零值定义多个变量
var name0, name1 T = value0, value1    // 指明类型,指明初始值定义多个变量var name = value                 // 根据值推断变量类型
var name0, name1 = value0, value1  // 根据值推断变量类型,可定义多个不同类型变量// var name0 T, name1 T              // 错误,var 不能在同一行出现多个类型名(同一类型也不行)// 将变量定义放在括号中
var (name0 = value0name1 = value1
)

2.短申明方式

短变量申明方式只能申明函数级变量,且需指明初始值。申明时不能指明变量类型,类型由初始化值确定。

name := value                   // 申明一个变量
name0, name1 := value0, value1 // 申明多个变量,变量类型可以不同

注意:申明多个变量时,只要有一个是新的即可。

func main() {oldVar := 1oldVar, newVar := 2, 3fmt.Printf("oldVar=%v newVar=%v\n", oldVar, newVar) // oldVar=2 newVar=3
}

可以看出 var 与短变量申明方式的区别有如下几点:
(1)var 既可以申明函数级变量,也可以申明包级变量,而短变量申明方式只能申明函数级变量,这是二者最大的区别;
(2)var 可以不指定初始值,而短变量申明方式必须指定初始值;
(3)var 可以指定数据类型,而短变量申明方式不能指定数据类型。

3.const

const 用于申明常量,需指明初始值,一旦创建不可修改。

由于编译时的限制, 定义它们的表达式必须也是可被编译器求值的常量表达式。例如 1<<3 就是一个常量表达式,而 math.Sin(math.Pi/4) 则不是,因为对 math.Sin 的函数调用在运行时才会发生。

const name T = value                    // 指明类型
const name0, name1 T = value0, value1  // 指明类型,定义多个常量
const name = value                     // 无类型常量
const name0, name1 = value0, value1        // 无类型常量,可定义多个// const name0 T, name1 T = value0, value1    // 错误,const 不能在同一行出现多个类型名(同一类型也不行)// 将常量定义放在小括号中
const (name0 = value0name1 = value1
)

在小括号中的常量声明列表,const 常与 iota 常量生成器联用,用来申明连续的数值常量集。

// 无类型数值常量集(可转为整型或浮点型)
const (Sunday = iota       // 0Monday              // 1Tuesday             // 2Wednesday           // 3Thursday            // 4Friday              // 5Partyday            // 6numberOfDays        // 7,该常量未导出
)// 无类型数值常量集(可转为浮点型)
const (Sunday = iota + 0.1    // 0.1Monday                // 1.1Tuesday               // 2.1Wednesday         // 3.1Thursday          // 4.1Friday                // 5.1Partyday          // 6.1numberOfDays      // 7.1,该常量未导出
)

关于 Go 的常量还需要知道:
(1)常量可以是类型化的或无类型化的。字面常量,true,false, iota 和某些只包含无类型化操作数的常量表达式是无类型化的;

(2)常量可由常量声明或类型转换显式地赋予其类型, 也可由变量声明或赋值以及作为表达式中的操作数隐式地赋予其类型。若常量的值不能由其类型表示就会产生一个错误。 例如,3.0 可赋予任何整数或浮点数类型的常量,而 2147483648.0 (等价于 1<<31)则只能赋予 float32, float64 或 uint32 类型的常量,而不能赋予 int32 或 string类型的常量;

(3)尽管数值常量在该语言中可拥有任意精度, 但编译器可能使用其有限精度的内部表示来实现它们。即,每个实现必须:

使用至少256位表示整数常量;
使用至少256位表示浮点常量,包括复数常量及尾数部分,和至少16位的有符号指数;
若无法精确表示一个整数常量,则给出一个错误;
若由于溢出而无法表示一个浮点或复数常量,则给出一个错误;
若由于精度限制而无法表示一个浮点或复数常量,则舍入为最近似的可表示常量。

这些要求适用于字面常量和常量表达式的求值结果。

注意,Golang 中的 const 不支持像 C/C++ 中修饰函数的参数和返回值,即下面的语句是非法的。

func test(const name *string)
func test(name *string) const *string

4.小结

三种变量申明方式有各自的使用场景,但有一点是相同的:在不同作用域申明的变量,会隐藏上一级作用域的同名变量。

var topVar = 1
func main() {{var topVar = 2fmt.Printf("topVar=%v\n", topVar,) // topVar=2}fmt.Println(topVar) // 1{topVar := 3fmt.Printf("topVar=%v\n", topVar,) // topVar=3}fmt.Println(topVar) // 1{const topVar = 4fmt.Printf("topVar=%v\n", topVar,) // topVar=4}fmt.Println(topVar) // 1
}

外层 topVar 的值并没有发生改变,可见大括号中的变量 topVar 是一个同名的新变量,隐藏了上一级的 topVar。


参考文献

[1] golang.org.A Tour of Go
[2] golang.org.Effective go
[3] golang.org.Language Specification
[3] Golang 25 个保留关键字

Golang 变量申明方式相关推荐

  1. golang简短变量说明,申明变量的方式

    在函数中声明变量时,可使用简短变量声明.s := "hello world",此时不需要使用关键字var,也不用指定变量的类型.同时完成了赋值给变量 使用简短变量申明时,编译器会推 ...

  2. 变量申明的提升,闭包,作用域,this,运算符优先级详细举例及讲解

    function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { al ...

  3. golang 变量定义和初始化

    变量命名原则 go语言的变量名有字母数字和下划线组成,首字母不能为数字,但是字母不仅仅只限于英文字母,所有的UTF-8字符都是可以的. 变量声明和初始化方式 使用var关键字 var a int = ...

  4. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  5. 变量置换方式linux,Shell变量测试与内容置换

    在脚本中,有时需要判断变量是否存在或是否被赋予了值,如果变量已经存在并且被赋予了值,则不改变变量:如果变量不存在或没有被赋值,则赋予其新值.这时我们就可以使用变量测试与内容置换. 我们在脚本中可以使用 ...

  6. K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用

    K8S configmap详解:从文件创建.从文件夹创建及以volume.env环境变量的方式在pod中使用 ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在 ...

  7. java改变变量编码方式_Java 10将如何改变您的编码方式

    java改变变量编码方式 突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 . 现在,两年后,局部变量类型推 ...

  8. java改变变量编码方式_Java 8中的5个功能将改变您的编码方式

    java改变变量编码方式 Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 尽管最初为该发行版设想的某些功能已扩展到第9版,或已推出第9版,但实际上有数十个新功能. 许多新添加的内容在编 ...

  9. python变量赋值方式_python变量和变量赋值的几种形式

    动态类型的语言 python是动态类型的语言,不需要声明变量的类型. 实际上,python中的变量仅仅只是用来保存一个数据对象的地址.无论是什么数据对象,在内存中创建好数据对象之后,都只是把它的地址保 ...

最新文章

  1. 如果不被吐槽,那我还是程序员吗
  2. 【Git】git的基本使用
  3. 点击按钮显示div并向div中传递参数
  4. linux自动应答,08. 创建 ks.cfg自动应答文件
  5. BHMS的完整形式是什么?
  6. 宝塔php开启zip组建,宝塔面板如何开启php扩展
  7. WebForm页面间传值方法(转)
  8. mysql dump 锁表_运行MySQLDump而不锁定表
  9. 18.TCP使用的注意事项
  10. js延时函数_JS 函数的执行时机
  11. iOS底层探索之类的结构—cache分析(上)
  12. 23_Open_Loop
  13. NS3中路由协议分析【AODV理论分析】
  14. 兼容性问题以及解决方案
  15. 计算机启动进入不了桌面图标,电脑开机不显示桌面图标怎么办,开机桌面图标不显示解决办法...
  16. 注册icloud邮箱
  17. kubernetes/k8s CRI 分析-kubelet删除pod分析
  18. 一键同步Elasticsearch,DataWorks数据集成同步解决方案上线!
  19. 单商户商城系统功能拆解39—分销应用—分销等级
  20. 使用 @Transactional

热门文章

  1. 1键将 Python2 代码自动转化为 Python3
  2. 企业打开云HBase的正确方式,来自阿里云云数据库团队的解读
  3. jQuery对象与DOM对象之间的转换方法
  4. nginx1.8.1反向代理、负载均衡功能的实现
  5. NIS企业级应用案例-统一Linux和Windows身份验证(二)
  6. 如何成功度过试用期?
  7. can总线学习(二)
  8. C++随记总结(1)----关于C++中的大小端、位段(惑位域)和内存对齐
  9. L1-066 猫是液体 (5 分)-PAT 团体程序设计天梯赛 GPLT
  10. 1062. 最简分数(20)-PAT乙级真题