概述
变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。变量可以通过变量名访问。 —— 百度词条
简单来说就是在程序中,为一段数据起一个名字,然后在程序中通过这个名字可以访问到这段数据。举个例子,这世间万物我们都可以把它看作都是数据,比如树、草、花、木、虫、鱼、人等等都是数据,但是为了方便识别不同的物种,我们给不同种类的物种都起了名字,比如 鲤鱼、玫瑰花、榕树…等,我们通过这些名字就知道哪个物种是玫瑰花,哪个物种是金丝雀;在程序中也是一样的,我们可以把数据看作例子中的物种,数据也是给有不同的,为了方便我们使用,所以我们需要给不同的数据定义方便我们使用的名字。
我们先来看看 变量的定义:var name type = 数据
- var 是关键字,告诉程序我要创建一个变量
- name 顾名思义就是这个变量的 名称,就是我们例子中所说的 名字。
- type 变量所指向数据的类型,我们上一章讲过为什么数据要有类型,就是为了更节省内存,提高我们程序的性能。
- =等于号 把 = 右边的这个数据和左边的变量名进行一个绑定,称之为 赋值,简单来说就是为 等于号 右边的数据起了一个 等于号 左边的名字。
我们使用代码创建几个变量
// 通过var关键字创建一个名称为a,类型为整型数字的变量;通过 = 把整数型数据1赋值(绑定)变量a
var a int = 1
// 通过var关键字创建一个名称为b,类型为整型数字的变量;通过 = 把整数型数据2赋值(绑定)变量b
var b int = 2
// 通过var关键字创建一个名称为name,类型为字符串的变量;通过 = 把字符串类型数据"小明"赋值(绑定)变量name
var name string = "小明"
// 使用 fmt.Println 把变量的数据打印出来
fmt.Println(a)
fmt.Println(b)
fmt.Println(name)
/*
输出结果:
1
2
小明
*/
之所以叫变量,是因为可以改变变量所指向数据指向,我们可以把 指向数据2的b重新指向到另一个数据(只能重新赋值所定义类型同类型数据):
// 创建 整数型 变量 b,并指向数据2
var b int = 2
// 变量b重新指向数据10
b = 10
// 此处打印变量b的数据是10
fmt.Println(b)
/*
输出结果:
10
*/
所以变量的重点就是指向可变
创建变量我们也叫 初始化变量,上面创建变量的方式一般称之为 显式创建,上面我们已将详细的讲解完了变量以及变量的创建方式,其实变量创建有几种方式,下面我们进行讲解。
显式创建多个同类型变量:
(有一点需要特别注意,函数内的变量创建后,如果没有被使用,编译器就会报错)
// 同时创建4个变量 a,b,c,d,并分别赋值1,2,3,4
var a,b,c,d int = 1,2,3,4
fmt.Println(a)
fmt.Println(c)
/*
输出结果:
1
3
*/
推导创建,也有人叫 隐式创建,即不需要写明类型,由程序通过赋值来进行推断类型:
(编译器会根据右边的数据类型,来判断变量的类型)
// int类型的变量
var a = 1
// string字符串类型的变量
var b = "国漫之光没钱更新"
// 当隐式的去创建浮点型变量时,编译器会默认使用 float64
var c = 0.5
// 同时创建多个变量
var number,name = 20, "大明"
推导式简写创建,只能用于函数内:
(实际开发中,这种简写的方式使用的比较多)
// 省略 var 通过 := 分号加等于号的方式去创建,编译器会根据数据值推断出数据类型
name := "灵笼"
age := 18
// 同时创建多个
description,sex := "描述",0
除了上述所说的变量之外,另外还有三种变量 匿名变量、全局变量、指针变量,这三种变量跟上述所讲的变量会有些不同。
匿名变量,匿名变量用 _ 英文下划线命名,表示抛弃,不占用任何内存,这里说一下常见的使用场景,程序中有两个函数 main 和 getNumbers,getNumbers函数的调用结果返回两个数据,而main函数只需要使用getNumbers的一个数据,这时就可以使用匿名函数进行接收,具体看代码:
// 结果返回两个数据,分别是名称、年龄
func getNumbers()(string, int) {
return "小明", 18
}
func main() {
// 创建两个变量 名称 和 匿名函数,根据getNumbers()结果,把"小明"赋值到name变量,把年龄18的数据使用匿名变量抛弃掉。
name,_ := getNumbers()
fmt.Println("你的名字是:" + name)
}
全局变量,定义在函数之外的函数称之为全局变量,整个源文件下的函数都能使用的变量,这种变量定义后不被使用也不会编译报错。
// 全局变量
var(
name string
age int
)
func main() {
name = "勿忘国耻"
fmt.Println(name)
}
/*
age 没有被使用,程序不会报错,正常运行
输出结果:
勿忘国耻
*/
讲指针变量之前,我们先简单讲一下内存,我们电脑上运行的所有程序,它的数据都是运行在内存中的,我们可以把内存看成是一个房间,而我们的数据是房子里的物品,房子里有床、桌子、被子、柜子等等;
比如床在房间的中间,柜子在房间的左边,被子在床的上面,桌子在房间的右边,而我们可以通过这些位置信息知道对应什么位置的是什么物品,比如中间的位置是床,左边是柜子;
我们对于内存也可以这么理解,数据就是房间的物品,每个数据都是放在内存中的,那么每个数据都有一个它再这个内存中的位置信息,我们把这个数据的位置信息叫做内存地址。
我们上面代码中讲的类型变量都是直接指向数据值本身的,而指针变量不同,它所指向的是 数据所在的内存地址,看代码:
func main() {
name = "勿忘国耻"
fmt.Println(name)
// &加变量名 得到指针,内存地址,把name的内存地址付给 namePointer 变量
namePointer := &name
fmt.Println(namePointer)
// *加内存地址得到数据值
fmt.Println(*namePointer)
// 使用new()函数初始化一个string字符串类型指针的变量
t1 := new(string)
fmt.Println("初始化:", t1)
}
/*
输出结果:
勿忘国耻
0xd18c70
勿忘国耻
初始化:0xc0000881e0
*/
零值
什么是 零值,就是变量创建时,不进行赋值,编译器会默认给变量进行赋值
var a int
var b string
var c bool
var d float64
var e byte
var f rune
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
/*
输出结果:
0
(空字符串)
false
0
0
0
*/
描述 | 类型 | 零值 |
---|---|---|
字符类型 | byte, rune | 0 |
数值类型 | float32, float64, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, complex64, complex128 | 0 |
布尔类型 | bool | false |
字符串 | string | “” 空字符串 |
slice切片 | []TYPE | nil |
map | map[TYPE]TYPE | nil |
指针 | uintptr | nil |
函数 | func | nil |
接口 | interface | nil |
信道 | chan | nil |
在这里对类型再做一个补充,我们的数据类型可以分为两种
- 值类型,像 int、float、bool、string、数组、struct结构体这些都是值类型,顾明思意,就是变量直接指向内存中数据的值。
- 引用类型,就像上面说到的指针,是指向了数据所在内存的地址。
以上就是变量的全部内容
常量
常量,跟变量有点类似,顾明思意,是不会变的,创建时要指定值,一旦设定了值,就不可更改。不能像变量那样可以重新赋值。
常用的场景是存放一些固定的值,比如圆周率、一年的月数、一年的季度等固定不变的数据。
创建变量时,使用的是 var 关键字,那么创建常量也是要使用关键字的, const关键字。
定义: const name type = 数据
(常量定义时一定要赋值,不然会报错,常量也是可以忽略类型进行推导创建的)
// 创建常量
const months int = 12
const pi float64 =
3.14159
// 创建根据赋值推导类型的多个常量
const spring,summer,fall,winter = "春","夏","秋","冬"
/*
枚举
const (
spring = "春"
summer = "夏"
fall = "秋"
winter = "冬"
)
*/
func main() {
fmt.Println("一年有" + months + "个月")
fmt.Println("一年有四季:", spring, summer, fall, winter)
// 空行
fmt.Println()
fmt.Println("圆周率" + pi)
}
iota 关键字, iota 默认值为0,每往下都会 增加
// iota 默认值是 0,每往下一行iota的值就会+1
const (
a = iota
b = "原神"
c
d = iota
e
f
)
func main() {
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(f)
}
/*
输出结果:
0
原神
原神
3
4
5
*/
最后
以上就是成就樱桃为你收集整理的3.go基础入门-变量与常量的全部内容,希望文章能够帮你解决3.go基础入门-变量与常量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复