3.go基础入门-变量与常量

本文详细介绍了编程中的变量与常量概念。变量是储存计算结果或表示值的抽象,包括创建、赋值、类型以及内存地址等方面。常量则是不可更改的值,用于存放固定不变的数据。文中通过实例演示了Go语言中变量和常量的声明、使用以及它们的零值。此外,还提及了匿名变量、全局变量、指针变量和常量的用法,强调了它们在程序设计中的作用。
摘要由CSDN通过智能技术生成

变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。变量可以通过变量名访问。 —— 百度词条

简单来说就是在程序中,为一段数据起一个名字,然后在程序中通过这个名字可以访问到这段数据。举个例子,这世间万物我们都可以把它看作都是数据,比如树、草、花、木、虫、鱼、人等等都是数据,但是为了方便识别不同的物种,我们给不同种类的物种都起了名字,比如 鲤鱼、玫瑰花、榕树…等,我们通过这些名字就知道哪个物种是玫瑰花,哪个物种是金丝雀;在程序中也是一样的,我们可以把数据看作例子中的物种,数据也是给有不同的,为了方便我们使用,所以我们需要给不同的数据定义方便我们使用的名字。

我们先来看看 变量的定义: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, rune0
数值类型float32, float64, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, complex64, complex1280
布尔类型boolfalse
字符串string“” 空字符串
slice切片[]TYPEnil
mapmap[TYPE]TYPEnil
指针uintptrnil
函数funcnil
接口interfacenil
信道channil

在这里对类型再做一个补充,我们的数据类型可以分为两种

  • 值类型,像 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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值