- Go语言入门
- Go语言开发环境安装配置
- Go语言程序结构
- Go语言基础语法
- Go语言数据类型
- Go语言变量
- Go语言常量
- Go语言运算符
- Go语言条件和决策
- Go语言循环
- Go语言函数
- Go语言作用域规则
- Go语言字符串
- Go语言数组
- Go语言指针
- Go语言结构体
- Go语言切片
- Go语言范围(range)
- Go语言映射
- Go语言递归
- Go语言类型转换
- Go语言接口
- Go语言错误处理
-
Go编程代码实例
- Hello World程序实例
- Go变量实例
- Go常量实例
- Go for循环语句实例
- Go if/else语句实例
- Go switch语句实例
- Go切片实例
- Go范围实例
- Go函数实例
- Go函数多个返回值实例
- Go可变参数的函数实例
- Go闭包(匿名函数)实例
- Go函数递归实例
- Go指针实例
- Go指针实例
- Go接口实例
- Go错误实例
- Go程序实例
- Go通道实例
- Go通道缓冲实例
- Go通道同步实例
- Go通道路线实例
- Go Select实例
- Go超时(timeouts)实例
- Go非阻塞通道操作实例
- Go关闭通道实例
- Go通道范围实例
- Go计时器实例
- Go断续器实例
- Go工作池实例
- Go速率限制实例
- Go原子计数器实例
- Go互斥体实例
- Go有状态的goroutines实例
- Go排序实例
- Go按自定义函数排序实例
- Go panic错误处理实例
- Go延迟(defer)实例
- Go集合函数实例
- Go字符串函数实例
- Go字符串格式化实例
- Go正则表达式实例
- Go JSON实例
- Go时间日期实例
- Go时代(Epoch)实例
- Go时间格式化/解析实例
- Go随机数实例
- Go数字解析实例
- Go URL解析实例
- Go SHA1哈希实例
- Go Base64编码实例
- Go读取文件实例
- Go写文件实例
- Go行过滤器实例
- Go命令行参数实例
- Go命令行标志实例
- Go环境变量实例
- Go执行过程实例
- Go信号实例
- Go退出程序实例
Go语言变量
变量只是给程序可以操作的存储区域的名字。Go中的每个变量都有一个特定的类型,它决定了变量的内存大小和布局; 可以存储在存储器内的值的范围; 以及可以应用于该变量的一组操作。
变量的名称可以由字母,数字和下划线字符组成。它必须以字母或下划线开头。大写和小写字母是不同的名称,因为Go是区分大小写的。基于前一章中解释的基本类型,有以下基本变量类型:
类型 | 描述 |
---|---|
byte | 通常为单个八位字节(一个字节),这是一个字节类型。 |
int | 机器最自然的整数大小。 |
float32 | 单精度浮点值。 |
Go编程语言还允许定义各种其他类型的变量,我们将在后续章节中介绍如枚举,指针,数组,结构,联合等。在本章中,只学习研究基本变量类型。
Go变量定义
变量定义意味着告诉编译器为变量创建存储的位置和大小。变量定义需要指定数据类型,并包含该类型的一个或多个变量的列表,如下所示:
var variable_list optional_data_type;
这里,optional_data_type
是有效的Go数据类型,包括:byte
,int
,float32
,complex64
,boolean
等或任何用户定义的对象等,并且variable_list
可以包括一个或多个用逗号分隔的标识符变量名称。一些有效的声明如下所示:
var i, j, k int; var c, ch byte; var f, salary float32; d = 42;
var i,j,k;
这一行,声明和定义变量i
,j
和k
; 它指示编译器创建名称为i
,j
和k
的类型为int
的变量。
变量可以在它们的声明时初始化(赋值一个初始值)。变量的类型由编译器基于传递给它的值自动判断。初始化器由一个等号和一个常量表达式组成,如下所示:
variable_name = value;
一些例子是:
d = 3, f = 5; // declaration of d and f. Here d and f are int
对于没有初始化器的定义:具有静态存储的变量使用nil
隐式初始化(所有字节都为0
); 所有其他变量的初始值为其数据类型的零值。
静态类型声明
静态类型变量声明为编译器提供了保证,即一个给定类型和名称的变量,以便编译器继续进行进一步编译,而不需要有关变量的完整详细信息。变量声明仅在编译时有其意义,编译器需要在链接程序时按实际的变量声明执行。
示例
尝试下面的示例,其中变量已声明为一个类型,并已在main
函数中定义和初始化:
package main import "fmt" func main() { var x float64 x = 20.0 fmt.Println(x) fmt.Printf("x is of type %T\n", x) }
当上述代码编译和执行后,它产生以下结果:
20 x is of type float64
动态类型声明/类型推断
动态类型变量声明要求编译器根据传递给它的值来解释变量的类型。但编译器并不需要指定一个变量为静态类型。
示例
看看下面的示例,这里的变量声明没有任何类型,并已在main
函数中定义和初始化。注意,在类型推断的情况下,已经将变量y
初始化为 :=
运算符,其中x
使用=
运算符初始化。
package main import "fmt" func main() { var x float64 = 20.0 y := 42 fmt.Println(x) fmt.Println(y) fmt.Printf("x is of type %T\n", x) fmt.Printf("y is of type %T\n", y) }
当上述代码被编译和执行时,它产生以下结果:
20 x is of type float64 y is of type int
混合变量声明
不同类型的变量可以在一次声明中使用类型推断。
示例
package main import "fmt" func main() { var a, b, c = 3, 4, "foo" fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Printf("a is of type %T\n", a) fmt.Printf("b is of type %T\n", b) fmt.Printf("c is of type %T\n", c) }
当上述代码被编译和执行时,它产生以下结果:
3 foo a is of type int b is of type int c is of type string
Go中的左值和右值:
Go中有两种表达式:
左值(
lvalue
):引用存储器位置的表达式称为“lvalue
”表达式。左值可能出现在作业的左侧或右侧。右值(
rvalue
):术语右值(rvalue
)是指存储在内存中某个地址的数据值。右值是不能赋值给它的值的表达式,右值只可能出现在赋值的右侧而不是左侧。
变量是左值,因此可能出现在赋值的左侧。数字文字是右值,因此不可能分配,也不能出现在左侧。以下是有效的语句:
x = 20.0
但以下不是有效的语句,并会生成编译时错误:
10 = 20