大白话学Go语言(4) 谈谈Go语言变量.md

2022/6/13 Go语言

以后就不宣传啥关注的了,占篇幅。dddd,就来这么~ 以后就不宣传啥关注的了,占篇幅。dddd,就来这么~

# Go变量

Go语言里面的变量类型,可不像Python那么简单,毕竟这是它作为静态语言的最后的骄傲。

go语言的变量类型有许多,比Python划分的更细节。下面是我列举的一些对比:

int float string list dict set 指针
Python
go 有,划分更细,有int int8 int16 int32 int64 uint uint32 uint64 rune 有,有float32 float64 有数组和slice之分,数组不可变,slice约等于python的list 有map,但是严格规定了map的类型

# 变量的定义和声明

# 科普一下变量的声明和赋值

我们定义一个变量,在Python里面,往往一步就能解决:

# 简单一句,就可以定义一个值为1的变量a
a = 1
1
2

上面的代码看起来我们一步就完成了a的定义,但其实变量的定义是分2个阶段的。

  • 声明阶段

    在静态语言中,变量都是需要指定它的类型的,这一个步骤又被称为变量的声明。这一步我们在其他语言经常见到:

int a;
1
  • 赋值阶段

    而变量只声明,那它的值是多少呢?所以我们会有第二个步骤:赋值,我们需要给变量赋一个初始值。但往往这2步可以合二为一:

int a = 3;
1

int a是第一个步骤,a = 3是第二个步骤,这就是合起来的写法。

所以Python只不过是简化了这个过程,这也是Python简洁的原因之一。

# 再谈go语言的变量

go语言在变量的定义和Python不同,它有多种方式。我们都知道,静态语言,譬如Java这样的,都是这样的变量声明方式:

变量类型 变量名 = 变量值
1

但go比较奇葩,喜欢反着来,比较适合水哥。接下来我们来看看go的几种变量声明方式。

  • var

    var声明是类似于js的方式,比如:

// 注意: go语句结尾不需要分号,很帅气
var a = 3
1
2

上面是一种声明方式,但因为go严格规定了类型,而上面为什么没有对应的类型呢?因为go为了方便,有些变量一看就知道是什么类型,它会给你进行隐式声明(在一些资料里面经常会用到隐式和显式,啥意思呢,就是偷偷的光明正大的意思)。

所以呢,上面的声明变量的语句又等于:

// 看到这里你是不是一千万个卧槽,居然还有这么奇葩的语法
var a int = 3
1
2

因为3一般都是整形,所以如果你不声明类型的话,会默认给你安排成int。所以其实代码里面大部分的变量都是可以省略掉类型的(map/slice这样的除外,再省略就不知道里面是啥了)。

  • :=

    go为了不被人吐槽每次都要带上var,所以他有一种:=的赋值方式,这个就约等于python的=赋值了,注意是冒号等于

    但前提是,这个变量不能是全局变量。也就是说这样赋值的变量只能在方法里面用:

package main

func bangyidage() {
  // var方式
  var a = 1
  // :=方式
  b := 3
  // 带类型的方式
  var c float32 = 12.3
}
1
2
3
4
5
6
7
8
9
10

其中b := 3的方式比较方便,用的也比较多。但有个要注意的地方就是,go的变量不能声明了不用,也不能重复声明!!!

比如我先声明了var a = 1,接着使用 a:=2,会报:

错误提示是,左边的变量名不是一个新的变量

如果我们定义了变量b,又想修改之。那我们可以给他重新赋值,也就是上文说的变量的第二个步骤:

a := 2
// 这时候我要改a为3
a = 3
1
2
3

# 通过=直接赋值就好了,因为a之前已经定义过,所以不能对他重复声明,而:=是带有声明操作的。

补充一个知识点,go里面是可以先声明,后赋值的(也就是把变量的声明和赋值分开),如果只声明一个变量,变量的默认值为该类型的初始值。什么意思呢?假设你声明一个int,那它默认就是0,声明为string,默认就是空字符串。

有这么一个场景,如果榜一大哥今天打赏5块以上,那么我的心情就会是Happy,没打赏我就是空字符串,5块以下就是UnHappy。在go里面就是这样子的:

package day03

import "fmt"

// dashang是个int类型的变量
func bangyidage(dashang int) {
	var a string
	if dashang >= 5 {
    // 如果要对已经声明过的变量赋值,直接用=即可,注意不是:=哦
		a = "happy"
	} else {
		a = "unhappy"
	}
	fmt.Println("我的心情: ", a)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 同时定义多个变量

go也支持同时定义多个变量,和Python基本一致:

// 除了:=以外,其他都一样
a, b := 1, 2

// var也支持
var c, d = 3, 4

var e, f int = 5, 6
1
2
3
4
5
6
7

# 今日总结

  1. go里面有多种数据类型,比Python种类更丰富,更细致
  2. go定义变量的方式有很多种,有var:=2种
  3. go的变量不能重复声明,只能重新赋值
  4. go允许变量只声明不赋值,那样变量的值默认是该类型的初始值
  5. go变量不能声明却不使用,否则会导致编译出错
  6. :=只能用于方法里面的变量声明
  7. go变量的声明方式是: var 变量名 类型,与传统的方式不一致(奇葩)
  8. go也支持同时声明多个变量

# 下节介绍

go里面的常量。Respect!