变量
变量,在程序中通常代表着一个会变化的“量”。
在程序中,我们通常会面临这样一个情况:
有一个东西,我们需要在好几个地方都要用到它,但是由于这个东西本身只有一个,所以我们在使用它之前,可以先给这个东西起一个“别名”,然后在需要用它的地方,只需要喊出这个“别名”,我们就能知道这个“别名”指代的是这个东西了。
举一个很简单的例子:
有一个人,他的名字叫做“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”,我们需要在程序的多个地方都使用到这个名字,但是显然每次都写全名的话会很麻烦,这时候机智的你就可以给他起一个“别名”,例如“小夫”,后续使用时,你只需要写上“小夫”,大家自然懂得你叫的是谁。
这个起“别名”的方式,在 Go 语言里就叫做定义一个变量。
定义变量
在 Go 语言里,通过使用关键字 var
来定义一个变量,其语法为 var 变量名 变量类型 = 变量值
:
package main
import "fmt"
var name string = "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫"
func main() {
fmt.Println(name)
}
其中,var name string = "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫"
就是定义变量的语法,意思是我们定义了一个内容为“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”这样一串字符的变量 name
。
关键字 var
表示我们要定义一个变量,name
表示我们给这个变量起名为 “name”。
紧接着后面的 string
表示这个变量的类型为 string
(字符串类型,用来表示一串字符,Go 语言中的内置基本类型,后面会详细介绍)。
= "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫"
则代表着这个变量的值是“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”这样一串字符。
这里有两点需要注意:
- 所有的变量都有自己的类型,变量的值只能为该类型的值。
- 在 Go 语言中,我们自己写的任意一串字符都需要用引号包括起来,以告知编译器这串字符是我们自己定义的。
变量赋值
变量,变量,那它的值自然是可以改变的啦。
package main
import "fmt"
var name string = "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫"
func main() {
fmt.Println(name)
name = "沃夫斯里积士丁可辛贝格多夫"
fmt.Println(name)
}
首先,我们知道程序是从上到下逐行执行的,那么在这里,程序就会先打印出“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”,接下来我们修改了变量 name
的值,那么再打印 name
时就会打印出“沃夫斯里积士丁可辛贝格多夫”了。
当然,因为可以中途修改变量的值,所以你也可以在定义变量的时候不进行赋值,待后续再进行赋值:
package main
import "fmt"
var name string
func main() {
name = "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫"
fmt.Println(name)
}
如果想同时定义多个相同类型的变量时,可以简写成:
package main
import "fmt"
var name1, name2, name3 string
func main() {
name1 = "胡柏"
name2 = "布里恩"
name3 = "沃夫斯里积士丁可辛贝格多夫"
fmt.Println(name1)
fmt.Println(name2)
fmt.Println(name3)
}
同时定义多个相同类型的变量并进行赋值时,变量和值均使用逗号分割,并一一对应:
package main
import "fmt"
var name1, name2, name3 string = "胡柏", "布里恩", "沃夫斯里积士丁可辛贝格多夫"
func main() {
fmt.Println(name1)
fmt.Println(name2)
fmt.Println(name3)
}
什么?还是觉得麻烦?那好吧,我们再简化一下:
package main
import "fmt"
func main() {
name1 := "哈哈哈"
name2, name3, name4 := "胡柏", "布里恩", "沃夫斯里积士丁可辛贝格多夫"
fmt.Println(name1)
fmt.Println(name2)
fmt.Println(name3)
fmt.Println(name4)
}
怎么样,是不是简洁了好多?我们在这里使用了一个特殊的符号 :=
来省去了 var
和 type
,这种形式叫做“简短声明”。
刚不是说变量必须要有类型吗?那这里我们没有声明类型怎么办呢?别担心,:=
符号会告知编译型自己进行类型推导的啦。
细心的你可能发现了,这一次我们把变量定义写在了函数里面,是的,这就是使用 :=
需要注意的地方,即它只能用在函数内部,在函数外部使用则会无法编译通过。
因此,我们通常在函数外(全局范围下)使用 var
形式,在函数内使用 :=
。
嗯,还有一个问题,如果想要同时声明不同类型的变量时,有什么简洁的形式呢?
你只需要在 var
关键后使用括号将多个变量括起来就可以啦。
var (
name string = "Tom"
age int = 18
isMale bool = true
)
变量命名
在给一个变量起名时,你只需要注意以下规则:
- 以
_
或英文字母开头 - 变量名可以包含数字
- 变量名区分大小写
- 一些特殊的关键字是不被允许的,例如
var
、func
这些语言本身要使用的“保留字” _
(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃
在我们谈论变量时,还有一件非常重要的事情:
请明智地给变量命名,如果需要的话甚至花费时间仔细思考一下。
变量命名是编程中最重要和最复杂的技能之一。甚至可以通过浏览变量名称来分辨出哪些代码是由初学者编写的,哪些是由有经验的开发人员编写的。
在一个真实的项目中,我们大部分时间都会花在修改和扩展现有的代码库,而不是写一些完全独立的东西上。因此当我们在做完一些其他事情之后再回到代码时,良好的命名会使得我们更加容易的获得一些有用的信息。
因此,请在声明变量之前花一些时间来考虑合适的变量名称,这将会给你带来很多好处。
业界有一些很好的规则:
- 使用人类可读的名称,如
username
。 - 尽可能不使用缩写或短名称或数字,比如
a
、b
、value1
,除非你真的知道你在做什么。 - 使名称能够最大限度地描述其所代表的含义并保持简洁。
听起来很简单?嗯,确实如此,但想要在实践中创造出好的描述性和简洁的名字,你还有一段很长的路要走。
常量
常量,就是在程序编译阶段就确定下来,而程序在运行时无法改变该值的量,简单来说就是一旦定义了之后就不会发生改变的量。
常量使用 const
来定义:
package main
import "fmt"
const name = "小明"
func main() {
fmt.Println(name)
}
在定义常量时,类型不是必须的,但是也支持明确指定其类型:
package main
import "fmt"
const name string = "小明"
func main() {
fmt.Println(name)
}
常量只可以是字符、字符串、布尔或数字类型的值。
常量不能使用 := 语法定义。