go语言变量和运算符

主要介绍go语言变量,运算符等

变量

变量被定义为程序运行时储存和操纵数据的实体。变量可以通过变量名访问。 变量名格式:字母数字下划线,不能以数字开头。

变量声明:

var variable_name variable_type

也可以一次声明多个变量

var variable_name, variable_name1 variable_type

变量声明

  • 指定变量类型,如果没有初始化,则变量默认为零值。
1
2
3
4
5
6
7
8
9
10
fmt.Println()
// 默认false
var b bool
fmt.Println(b)
// 默认 "" 空字符串
var s string
fmt.Println(s)
// 默认0
var i int
fmt.Println(i)
  • 第二种, 根据值自行判定变量类型

不需要显示声明变量类型,自动推断

var v_name = value

比如: var num = 1

  • 变量的简短声明

x := 1 这个代码中, x 自动被声明为 int 类型,并存储了值 1 。 这种方式只能被用在函数体内。

如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误

  • 多变量声明
1
2
3
4
5
6
7
8
9
10
11
12
13
var vname1, vname2, vname3 int
vname1, vname2, vname3 = 1, 2, 3
fmt.Println(vname1, vname2, vname3)

vname4, vname5 := 4, 5
a, b, c := 5, 7, "abc"
fmt.Println(vname4, vname5)

// 这种因式分解关键字的写法一般用于声明全局变量
var (
vname1 v_type1
vname2 v_type2
)

值类型和引用类型

所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:

当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝

可以通过 &i 来获取变量 i 的内存地址

如下, 可以看到, i 和 j 实际上对应的内存地址是不同的。

1
2
3
4
5
var i = 1
var j = i
fmt.Println(&i, &j)
# 结果
0xc00000a0e8 0xc00000a0f0

堆内存和栈内存:栈内存用于存储局部变量以及函数调用的信息。堆内存用于存储程序中创建的对象和实例。

变量的值存储在堆内。

更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。

位(Bit)是数据存储的最小单位,字节(Byte)常用于处理字符级数据,而字(Word)则是计算机硬件设计的基本单位,与特定计算机体系结构有关。

一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。

这个内存地址称之为指针,这个指针实际上也被存在另外的某一个值中。

引用类型的变量存储的是一个指向实际数据的引用。

当将一个引用类型的变量赋值给另一个变量时,两个变量将引用同一个数据,修改一个变量会影响到另一个变量。

注意事项

  • 同一个变量不能被重复初始化声明 ,会提示 no new variables on left side of :=
  • 声明了局部变量没有使用,会编译报错 xxx declared but not used
  • 如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同
  • 空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。
  • _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。
  • 并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)。

常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型和字符串型。

定义格式如下

const identifier [type] = value

可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

常量也可以用作枚举

1
2
3
4
5
6
const (
Unknown = 0
Female = 1
Male = 2
)

数字 0、1 和 2 分别代表未知性别、女性和男性。

常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过:

1
2
3
4
5
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)