Go基础 —— 目录
文章目录
一、Go 变量
1.1 变量的声明
Go是静态类型语言,因此变量是有明确类型的,编译器也会检查变量类型的正确性。
1.1.1 声明变量的标准格式
// 声明变量的标准格式
var name type
/*
其中,var 是声明变量的关键字,name 是变量名,type 是变量类型
*/
1.1.2 批量声明变量
// 批量声明变量
var (
a int
b string
c float32
)
1.1.3 声明变量的简短格式
// 声明变量的简短格式
name := expression
注意,简短模式有以下限制:
- 定义变量,同时显式初始化
- 不能提供数据类型
- 只能用在函数内部
1.2 变量的初始化
1.2.1 变量初始化的标准格式
var name type = expression
1.2.2 编译器推导类型的格式
var a = 10
在标准格式的基础上,将int
省略后,编译器会尝试根据等号右边的表达式推导a
变量的类型
(等号右边的部分在编译原理里被称为右值(rvalue))
1.2.3 短变量声明并初始化
a := 100
注意:由于使用了:=
,因此推导声明写法的左值变量必须是没有定义过的量。若定义过,将会发生编译错误。
注意:在多个短变量声明和赋值中,至少有一个新声明的变量在左值中,即便其他变量名可能是重复声明的,编译器也不会报错
conn, err := net.Dial("tcp", "127.0.0.1:8080")
conn2, err := net.Dial("tcp", "127.0.0.1:8080")
二、Go 多个变量同时赋值
“多重赋值”
// 交换 a,b 的值
var a int = 100
var b int = 200
a, b = b, a
三、匿名变量
在编码过程中,可能会遇到没有名称的变量、类型或方法。
虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。
使用_
表示匿名变量。
_
本身是一个特殊的标识符,被称为空白标识符。
它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。
使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
四、变量的作用域
根据变量定义位置的不同,可以分为以下三个类型:
- 函数内定义的变量,称为局部变量
- 函数外定义的变量,称为全局变量
- 函数定义中的变量,称为形式参数
4.1 局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。
4.2 全局变量
在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用import
关键字引入全局变量所在的源文件之后才能使用这个全局变量。
全局变量声明必须以var
关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
4.3 形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。
形式参数会作为函数的局部变量来使用。
五、数据类型转换
在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。
由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:
valueOfTypeB = typeB(valueOfTypeA)
注意:
- 类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将
int16
转换为int32
)。 - 当从一个取值范围较大的类型转换到取值范围较小的类型时(将
int32
转换为int16
,或将float32
转换为int
),会发生精度丢失(截断)的情况。 - 只有相同底层类型的变量之间可以进行相互转换(如将 int16 类型转换成 int32 类型),不同底层类型的变量相互转换时会引发编译错误(如将 bool 类型转换为 int 类型):
六、常量
Go语言中的常量使用关键字const
定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。
6.1 定义常量的语法
const name [type] = value
6.2 常量生成器iota
常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。
在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明的行加一。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
6.3 无类型常量
编译器为没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算,可以认为至少有 256bit 的运算精度。
这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。
通过延迟明确常量的具体类型,不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。