博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二章-go中的变量
阅读量:2197 次
发布时间:2019-05-02

本文共 2699 字,大约阅读时间需要 8 分钟。

前言

很多开发语言中都存在变量,而go也是。需要注意go是静态类型语言,所以不能像某些语言(例如JavaScript)那样在运行期间改变变量的类型。下面会给大家介绍变量如何使用与使用期间可能存在的坑。注意本文是基于go 1.12.5的,可能会与其他版本存在差异。

变量命名规则

既然有变量就必然有变量名,而在很多支持变量的语言中,变量名一般都会有命名规则。而go也不例外,下面是go的变量名命名规则:

  1. 变量名由字母、数字、下划线组成,其中首个字符不能为数字。
  2. 变量名不能与go语言中的保留字相同

PS:建议命名变量名按照驼峰命名法

下面会简单介绍一下保留字的概念以及go中保留字

保留字

保留字指的是在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用。所以如果出现重名,就无法区分这个是保留字还是变量名了。而在go中保留字并不多,才25个:

break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var

变量名示例

下面我会列出一些变量名的示例给大家参考,首先是合法变量名:

dayday1day_1last_namelastName

然后是演示一些不合法的变量名:

1day //以数字开头day-1 // 使用了非法字符-var // 保留字

变量声明

go语言中,变量的声明有好几种方法,下面会给大家一一列举。

使用var声明变量

go中有一个用于声明变量的关键字var,下面会演示如何使用var声明变量

var i int = 10 //语法为 var 变量名 变量类型 = 变量值

但是其实使用var时可以不需要赋值,由go根据设定的类型自动赋默认值。例如下面的示例

var i  int // 语法为 var 变量名 变量类型,此时这个变量的默认值为0

而有些时候根本就没有必要在变量声明中指定变量类型,因为可以根据变量值进行类型推导,而go也恰好支持。

var i =10 //利用类型推导,不需要指定变量的类型

使用:=声明变量

除了使用var声明变量外,在函数中也可以使用:=来对变量赋值,但是也只可以用于函数中。

func main(){	i := 123	fmt.Println("i=",i) }

声明多个变量

有时候我们会需要声明多个变量,而go也支持同时一次声明多个变量

var i,j,k int // i,j,k的类型都是int

上面的例子是声明多个类型相同的变量,但是其实go也支持声明多个不同类型的变量,下面的写法叫做变量组

var (	i int	j float32	k float64)

当然了同时声明多个变量也是支持类型推导

var i,j,k = 1,"test",1.2 //按照声明的顺序依次赋值,等价于var i = 1 var j= "test"  var k = 1.2

多个变量声明时,如果变量的赋值需要计算,会先进行计算后,再依次进行赋值(需要注意计算时不能涉及声明中的变量)

var i,j = 100+1,100-1 //执行顺序:(100+1=101)=>(100-1=99)=>(var i=101)=>(var j=99)

变量使用

声明了变量之后,当然是开始使用了。而变量在使用时也会遇到各式各样的坑

基本使用

下面会使用一个从1累加到100的例子演示如何使用变量(这个示例使用了for循环关键字,但是不会影响大家理解)

package mainimport "fmt"func main() {	var total = 0 // 累加值	for i := 1; i <= 100; i++ {		total = total + i // 累加计算	}	fmt.Print(total) // 输出累加值}

输出结果

5050

变量分类

go中,变量分为2种:

  1. 全局变量:必须使用var声明,可以声明后不使用
  2. 局部变量:可以使用var或者:=声明,声明后必须被使用。否则编译失败
    例如以下的例子
package mainimport "fmt"var global = 100 //声明了全局变量,但是不使用func main()  {	var local = 200 //声明局部变量,必须要使用,否则编译失败	fmt.Print(local)}

变量作用域

go的变量存在作用域,存在以下两条规则

  1. 全局变量和局部变量如果同名,在局部变量的作用域内(一般为函数内),使用变量名访问的是局部变量
  2. 局部变量也存在作用域,下面使用一个例子来演示
    package mainimport "fmt"func main() {// main作用域	var local = 0 // 累加值	if true {// if作用域		var local = "hello"  // 声明了一个同名的变量		fmt.Println(local) //此时访问的是if作用域内的local	}	fmt.Println(local) // main作用域的local不受影响}
    输出结果
    1000

指针与引用

go语言是支持指针与引用,这个特性如果是学过C/C++的朋友应该会了解,下面使用一个示例演示

package mainimport "fmt"func main()  {	i := 1	j := &i // i的指针	fmt.Println("i=",i)	fmt.Println("j=",j) // 输出指针,即内存地址	fmt.Println("*j=",*j) // 通过指针引用i}

输出结果

i= 1j= 0xc000094000*j= 1

使用_处理未使用的局部变量

当我们在使用时,会出现一些局部变量不需要使用,但是我们又不得不声明,例如下面的例子

package mainimport "fmt"func main()  {	m := map[int]int{		1: 1,		2: 2,		3: 3,	} // 声明了一个map	for _,v := range m{ // 遍历map,由于不需要输出key,使用_占位		fmt.Println(v) // 需要注意go中的map每次遍历的顺序都是随机的,所以输出结果也是随机的	}}

输出结果

312

转载地址:http://jgoub.baihongyu.com/

你可能感兴趣的文章
Leetcode C++ 《拓扑排序-1》20200626 207.课程表
查看>>
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>
【Python】关于Python多线程的一篇文章转载
查看>>
【Pyton】【小甲鱼】文件
查看>>
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>
APP性能测试工具
查看>>