1 概述

变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念。
变量,是通过变量的标识符定位值的过程。变量的内存模拟演示:

2 定义:声明和初始化

定义变使用var关键字,需要指定其类型,可以同时初始化,如果没有指定初始化值,则使用类型的默认值,语法如下:

// 声明变量,未初始化(默认值初始化)
var name string
// 声明变量,特定值初始化
var user string = "Hank"

Go语言中的变量必须声明后才可以使用,不能直接使用未定义的变量。

3 类型默认值(零值)

Go语言的类型默认值如下所示:

  • 整型和浮点型变量的默认值为 0。
  • 字符串变量的默认值为空字符串。
  • 布尔型变量默认为 bool。
  • 切片、函数、指针变量的默认为 nil。

4 强类型

Go语言是强类型语言,变量必须有类型,同时变量仅仅可以存储特定类型的数据。

5 类型推导

定义变量时,如果指定了初始值,则可以省略类型的定义,Go语言可以自己由数据推导出类型。
语法为:

// 声明变量,特定值初始化,类型推导出user为字符串string型
var user = "Hank"

6 短声明(定义)

为了简化定义变量,使用运算符 := 配合类型推导,可以快速完成变量的定义,语法为:

user := "hank"

7 批量定义

使用var或:=都可以一次性定义多个变量,语法为:
var

var (
v1 = 42
v2 = "hank"
)
也可以
var v1, v2 = 42, "hank"

:=

v1, v2 := 42, "hank"

推荐使用 var() 声明块语法,因为代码维护容易。

8 批量赋值

一次性为多个变量进行赋值。(类似短定义。v1, v2, v3 := 42, “hank”, false)
当变量定义完毕后,再批量对其赋值,没有定义功能!
语法为:

var (
v1 int
v2 int
)
// 批量赋值
v1, v2 = 42, 1024

该语法,通常配合函数的批量返回来使用,一次性接收多个返回值,语法为:

func main() {
var (
v1 int
v2 int
)
// 调用函数,接收其返回值
v1, v2 = getData()
}
// 返回两个值的函数
func getData() (int, int) {
// 返回了两个值(假设42为最小值,1024为最大值)
return 42, 1024
}

非常方便的可以交换两个变量的值:

var (
v1 = 42
v2 = 1024
)
// 交换
v1, v2 = v2, v1

执行后,v1==1024, v2==42

9 匿名变量

标识符为(下划线)的变量,是系统保留的匿名变量,在赋值后,会被立即释放,称之为匿名变量。其作用是变量占位符,对其变量赋值结构。通常会在批量赋值时使用。
例如,函数返回多个值,我们仅仅需要其中部分,则不需要的使用
来占位,演示:

func main() {
var (
v int
)
// 调用函数,仅仅需要第二个返回值,第一,三使用匿名变量占位
_, v, _ = getData()
}
// 返回两个值的函数
func getData() (int, int, int) {
// 返回3个值
return 42, 1024, 2012
}

10 变量作用域

Go语言中的变量是块作用域。
块,指的是使用{}定义的代码段,包括函数,if/switch/for语句,或独立的{}都是块。在块内定义的变量仅仅在本块内可用。
定义,指的是 var 或者 := 定义的变量。
Go语言的作用域是层叠的,就是说内层块可以直接访问到外层块的变量,前提是内层块没有定义同名的外层变量。
演示如下:

// 全局(函数外)定义3个变量
var (
v1 = 1
v2 = 2
v3 = 3
)
func main() { // main{}函数块,定义2个变量
var (
v2 = 22
v3 = 33
)
fmt.Println(v1, v2, v3)
// 结果 1 22 33 {
// main()函数内部{}块,定义1个变量
var (
v3 = 333
)
fmt.Println(v1, v2, v3)
// 结果 1 22 333
}
}

上面代码中:
在main()中,v2,v3被重新定义,则在main()中,v1是外部,而v2, v3是main函数局部的。
在main()内部的{}中,v3被重新定义,则在main()内部的{}中,v1是外部,而v2是main()定义的, v3是main()内部{}定义的的。

变量可以沿内部作用域向外部作用域查找变量的过程。

带有{}的语句,其中的变量也仅仅在内部有效,例如for,if,switch等,演示:

for i := 0; i < 10; i++ {
fmt.Println(i)
}
fmt.Println(i)
// 会提示变量i未定义, undefined: i

注意i,是通过短声明在for内部定义的变量,仅仅在for内部有意义。

互不嵌套的{}见作用域不可见,不可互相访问。

func main() {
{
v := 42
}
{
fmt.Println(v)
// 会提示变量v未定义, undefined: v
}
}

完!
原文出自:小韩说课
微信关注:小韩说课

Go语言中的变量的更多相关文章

  1. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  2. C 语言中的变量为什么不能以数字打头

    C 语言中的变量为什么不能以数字打头? C 语言中的变量为什么不能以数字打头? 不要告诉我编译原理书上有.我暂时看不懂. 除了下面的解释外, “假如变量名允许以数字开头的话,那么语法分析器在解析一个全 ...

  3. C语言中不同变量的访问方式

    C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期.一般程序将内存分为数据段.代码段.栈段.堆段,这几类变量存储在不同的段中,造成了它 ...

  4. Go语言入门(二)Go语言中的变量、常量、数据类型、流程控制以及函数

    Go语言中的变量 通常用var关键声明变量,有常规方式和简化方式. 常规方式: var name1 type1 name1 = value1 //赋值 简化方式: var name2 = value1 ...

  5. go语言中在变量后加上接口是什么意思?

    如题刚刚开始学习go 语言有些不懂: a.Data = make(map[string]interface{}) 我认为它是在申请a.Data map为字符串类型的空间,那么它后面接一个空的inter ...

  6. 【R语言入门】R语言中的变量与基本数据类型

    说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...

  7. 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]

    c语言中变量分为四类,分别是 1.auto   自动变量 2.static   静态存贮分配变量(又分为内部静态和外部静态) 3.extern  全程变量(用于外部变量说明) 4.register   ...

  8. 你知道嵌入式C语言中各变量存储的位置吗?

    局部变量.局部静态变量.全局变量.全局静态变量区别如下: 局部变量: 栈区: 局部静态变量:静态区: 全局变量: 静态区的常量区: 全局静态变量:静态区. 在进行C/C++编程时,需要程序员对内存的了 ...

  9. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

随机推荐

  1. ubuntu桌面便签 sticky note, xpad

    sudo apt-get install xpad 软件有一个选项,叫做Show window decorations,显示窗口的标题栏.

  2. Lovable eccentric

    It took him four years to stage this elaborate joke simply to prove that critics do not always know ...

  3. RequireJS进阶-模块的优化及配置的详解

    概述 关于RequireJS已经有很多文章介绍过了.这个工具可以将你的JavaScript代码轻易的分割成苦干个模块(module)并且保持你的代码模块化与易维护性.这样,你将获得一些具有互相依赖关系 ...

  4. 深入解析Backbone.js框架的依赖库Underscore.js的作用

    这篇文章主要介绍了深入解析Backbone.js框架的依赖库Underscore.js的作用,用过Node.js的朋友对Underscore一定不会陌生:)需要的朋友可以参考下 backbone必须依 ...

  5. 事件总线(Event Bus)

    事件总线(Event Bus)知多少 源码路径:Github-EventBus简书同步链接 1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对 ...

  6. vim使用常看

    原网址http://www.runoob.com/linux/linux-vim.html 补充参考https://blog.csdn.net/w178191520/article/details/8 ...

  7. AngularJs学习笔记--Scope

    原版地址:http://code.angularjs.org/1.0.2/docs/guide/scope 一.什么是Scope? scope(http://code.angularjs.org/1. ...

  8. CentOS 安装 dokuwiki

    前期准备:yum 安装httpd和mysql 1.下载dokuwiki安装包 http://download.dokuwiki.org/: 2.centos系统中httpd的根目录为:/var/www ...

  9. node express 跨域问题

    express = require('express'); var app = express(); //设置跨域访问 app.all('*', function(req, res, next) { ...

  10. vector size函数使用注意事项

    vector 的size函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数: ...