zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Go 变量定义 使用注意事项

Go变量 定义 注意事项 使用
2023-09-14 09:15:18 时间

变量是程序组成的基本单位


不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,在程序里面无处不在。

  • 复用:抽象,修改一处,所有引用该变量值得地方,都修改到了
  • 配置,把程序的配置放到变量里面方便修改
  • 简洁,容易阅读

变量介绍


概念

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量(值)。

变量使用的基本步骤

  1. 声明变量(有人也叫∶定义变量)
  2. 赋值
  3. 使用

变量使用⚠️注意事项


(1)变量表示内存中的一个存储区域该区域有自己的名称(变量名)和类型(数据类型)

在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法

程序运行,在执行到定义变量的时候,会发生什么事情呢?(代码要运行起来,那么所有的代码必须加载到内存当中代码才可以运行) 

声明了变量i就会在内存里面开辟一个数据空间,同时生成变量i,i就和数据空间关联起来了,当你只是声明了变量,但是没有赋值的时候有一个默认的值为0。

之后赋值了10,那么就会通过变量i找到数据空间将里面的值改为10。

(2)Golang变量使用的三种方式

第一种∶指定变量类型,声明后若不赋值,使用默认值,int类型默认值为0,其他类型默认值再说

	var i int
	fmt.Println(i)  //0

 第二种∶根据值自行判定变量类型(类型推导)这个时候编译器就会去类型推导(下面未定义类型,直接赋值,声明变量并且赋值)

	var num = 10.1
	fmt.Printf("%T",num)

float64

第三种∶省略var,注意∶=左侧的变量不应该是已经声明过的,否则会导致编译错误

	var name string
	name = "tom"
	name := "tom"
	fmt.Printf("%T %s",name,name)

string tom

 上面就声明变量的时候同时赋值了。

(3)该区域的数据值可以在同一类型范围内不断变化

变量的值是可以变化的,但是有前提,要注意其作用域,其次类型不能发生变化。

(4)变量在同一个作用域内(简单理解在函数或者代码块里面)不能重名,不同的作用域是可以重名字的

(5)变量 = 变量名 +  数据类型  + 值,这一点请大家注意

(6)Golang 的变量如果没有赋初值,编译器会使用默认值,比如 int默认值0,string默认值为空

串,小数也是默认为0的。

变量的声明,初始化和赋值


声明变量

基本语法∶var 变量名 数据类型

var a int   这就是声明了一个变量,变量名是 a

var num1float32  这也声明了一个变量,表示一个单精度类型的小数,变量名是num1

初始化变量

在声明变量的时候,就给值。var a int= 45 这就是初始化变量a

使用细节∶ 如果声明时就直接赋值,可省略数据类型      var b = 400

给变量赋值

比如你先声明了变量∶var num int

然后,再给值 num=780,这就是给变量赋值

变量赋值


 与其他主要编程语⾔如java c++ 的差异

  • 赋值可以进⾏⾃动类型推断,可以不声明变量类型
  • 在⼀个赋值语句中可以对多个变量进⾏同时赋值,可以大大简化代码

 交换两个变量的值最常见的就是引入一个中间变量,go语言可以在一个语句里面对多个变量赋值

    var a,b int = 1,2

	var a,b  = 1,"2"

	a,b := 2,4
func TestExchange(t *testing.T){
	a := 1
	b := 2

	a,b = b,a
	t.Log(a,b)

}

=== RUN   TestExchange
    my_test.go:149: 2 1
--- PASS: TestExchange (0.00s)
PASS

指针类型变量


与其他主要编程语⾔的差异

1. 不⽀持指针运算
2. string 是值类型, 其默认的初始化值为空字符串,⽽不是 nil
	d := 1
	dPtr := &d
	fmt.Printf("%p,%T\n",dPtr,dPtr)

0xc000108010,*int

不支持指针的运算,在很多语言当中通过指针自增来访问连续的存储空间。但是在go语言里面是不支持指针运算的。

	dPtr = dPtr + 1

类型转化


与其他主要编程语⾔的差异

1. Go 语⾔不允许隐式类型转换(很多主流语言有潜规则,小类型可以向大大类型进行隐式转换,因为不会丢失数据, 在go语言当中任何的数据类型都不支持隐式转换 )
2. 别名和原有类型也不能进⾏隐式类型转换( 可以看到非常的严格,别名的隐式类型也是不支持的 )
type mytype int

	var b int
	fmt.Printf("%v,%v\n",reflect.TypeOf(a),reflect.TypeOf(b))
	b = int(a)

main.mytype,int