变量

变量,在程序中通常代表着一个会变化的“量”。

在程序中,我们通常会面临这样一个情况:

有一个东西,我们需要在好几个地方都要用到它,但是由于这个东西本身只有一个,所以我们在使用它之前,可以先给这个东西起一个“别名”,然后在需要用它的地方,只需要喊出这个“别名”,我们就能知道这个“别名”指代的是这个东西了。

举一个很简单的例子:

有一个人,他的名字叫做“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”,我们需要在程序的多个地方都使用到这个名字,但是显然每次都写全名的话会很麻烦,这时候机智的你就可以给他起一个“别名”,例如“小夫”,后续使用时,你只需要写上“小夫”,大家自然懂得你叫的是谁。

这个起“别名”的方式,在 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 语言中的内置基本类型,后面会详细介绍)。

= "胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫" 则代表着这个变量的值是“胡柏·布里恩·沃夫斯里积士丁可辛贝格多夫”这样一串字符。

这里有两点需要注意:

  1. 所有的变量都有自己的类型,变量的值只能为该类型的值。
  2. 在 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)
}

怎么样,是不是简洁了好多?我们在这里使用了一个特殊的符号 := 来省去了 vartype,这种形式叫做“简短声明”。

刚不是说变量必须要有类型吗?那这里我们没有声明类型怎么办呢?别担心,:= 符号会告知编译型自己进行类型推导的啦。

细心的你可能发现了,这一次我们把变量定义写在了函数里面,是的,这就是使用 := 需要注意的地方,即它只能用在函数内部,在函数外部使用则会无法编译通过。

因此,我们通常在函数外(全局范围下)使用 var 形式,在函数内使用 :=

嗯,还有一个问题,如果想要同时声明不同类型的变量时,有什么简洁的形式呢?

你只需要在 var 关键后使用括号将多个变量括起来就可以啦。

var (
    name string = "Tom"
    age int = 18
    isMale bool = true
)

变量命名

在给一个变量起名时,你只需要注意以下规则:

  • _ 或英文字母开头
  • 变量名可以包含数字
  • 变量名区分大小写
  • 一些特殊的关键字是不被允许的,例如 varfunc 这些语言本身要使用的“保留字”
  • _(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃

在我们谈论变量时,还有一件非常重要的事情:

请明智地给变量命名,如果需要的话甚至花费时间仔细思考一下。

变量命名是编程中最重要和最复杂的技能之一。甚至可以通过浏览变量名称来分辨出哪些代码是由初学者编写的,哪些是由有经验的开发人员编写的。

在一个真实的项目中,我们大部分时间都会花在修改和扩展现有的代码库,而不是写一些完全独立的东西上。因此当我们在做完一些其他事情之后再回到代码时,良好的命名会使得我们更加容易的获得一些有用的信息。

因此,请在声明变量之前花一些时间来考虑合适的变量名称,这将会给你带来很多好处。

业界有一些很好的规则:

  • 使用人类可读的名称,如 username
  • 尽可能不使用缩写或短名称或数字,比如 abvalue1,除非你真的知道你在做什么。
  • 使名称能够最大限度地描述其所代表的含义并保持简洁。

听起来很简单?嗯,确实如此,但想要在实践中创造出好的描述性和简洁的名字,你还有一段很长的路要走。

常量

常量,就是在程序编译阶段就确定下来,而程序在运行时无法改变该值的量,简单来说就是一旦定义了之后就不会发生改变的量。

常量使用 const 来定义:

package main

import "fmt"

const name = "小明"

func main() {
    fmt.Println(name)
}

在定义常量时,类型不是必须的,但是也支持明确指定其类型:

package main

import "fmt"

const name string = "小明"

func main() {
    fmt.Println(name)
}

常量只可以是字符、字符串、布尔或数字类型的值。

常量不能使用 := 语法定义。

results matching ""

    No results matching ""