手册教程~

Go - 变量

变量只是程序可以操作的存储区域的名称。Go中的每个变量都有一个特定的类型,它决定了该变量的内存的大小和布局、可以存储在该内存中的值的范围,以及可以应用于该变量的一组操作。

变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为Go是区分大小写的。基于前一章中解释的基本类型,将会有以下基本变量类型&减号;


序号类型
1

byte

2

int

3

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;


vari, j, k;声明并定义了变量i, j, k;它指示编译器创建类型为int的变量i、j和k。

变量可以在声明中进行初始化(赋值)。变量的类型由编译器根据传递给它的值自动判断。初始化器由一个等号和一个常量表达式组成,如下所示:


variable_name = value;


例如


d = 3, f = 5;    // declaration of d and f. Here d and f are int


对于没有初始化器的定义:静态存储持续时间的变量被隐式地初始化为nil(所有字节的值为0);所有其他变量的初始值为其数据类型的零值。

Go中的静态类型声明

静态类型变量声明向编译器保证有一个具有给定类型和名称的变量,以便编译器可以继续进行进一步编译,而不需要该变量的完整详细信息。变量声明只有在编译时才有意义,编译器在链接程序时需要实际的变量声明。

示例

试一下下面的例子,变量已经用类型声明并且初始化在主函数;

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

Go 使用 := 赋值操作符

动态类型变量声明要求编译器根据传递给它的值解释变量的类型。编译器不需要将变量静态地具有类型作为必要要求。

示例

尝试下面的示例,其中变量声明时没有任何类型。注意,对于类型推断,我们使用:=操作符初始化变量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
42
x is of type float64
y is of type int

Go中的混合变量声明

可以使用类型推断一次性声明不同类型的变量。

示例

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
4
foo
a is of type int
b is of type int
c is of type string