Golang语言的多种变量声明方式与使用场景详解

目录
  • 01介绍
  • 02变量声明方式
    • 标准声明变量
    • 不显式赋初始值声明变量
    • 省略类型声明变量
    • 短变量声明
    • 显式类型转换
    • 变量列表声明
    • 变量声明块
  • 03使用场景
    • 包级变量
    • 全局变量
    • 局部变量
  • 04注意事项:
  • 05总结

01介绍

在程序设计中,编译器必须将代表数据的变量名称替换成该数据所在的内存地址。变量的名称、类型及内存地址通常会维持固定,但该内存地址所存储的数据在程序执行期间则可能会改变。

Golang 语言编译器需要先明确变量的内存边界,才可以使用变量。通过声明变量使用的类型,编译器可以明确变量的内存边界。

因为 Golang 语言是静态语言,它不能像动态语言那样,在运行时可以通过分析变量的值,自动确定变量的内存边界,所以在 Golang 语言中,使用变量之前,需要先声明变量。

在 Golang 语言中,在变量显式赋值的前提下,声明变量可以省略类型,和使用短变量声明方法时,也不需要指定变量类型,此时,编译器会根据变量的值通过类型推断得出变量类型,从而明确变量的内存边界。

02变量声明方式

Golang 语言的变量声明比较灵活,它支持多种变量声明的方式,包括标准声明变量,不显式赋初始值声明变量,省略类型声明变量和短变量声明。

标准声明变量

var a int = 100

阅读上面这段代码,我们可以发现 Golang 语言的标准声明变量方式包含 4 部分,分别是 var 关键字,变量名 a,变量类型 int 和变量的值 100。

不显式赋初始值声明变量

如果我们不想给声明的变量赋初始值,也可以不显式给变量赋值,省略等号和值,如下所示:

var a int

如果不显式给变量赋值,变量的值是类型的零值,即类型的默认值。

省略类型声明变量

标准声明变量方式的 4 部分,除了可以不显式给变量赋值,还可以省略类型,如下所示:

var a = 100

我们在文章开头介绍编译器需要根据变量的类型确定变量的内存边界,如果在声明变量时,未指定变量的类型,编译器还可以确定变量的内存边界吗?

答案是可以。原因是 Golang 编译器可以根据变量的赋值通过类型推断得到变量的类型。

细心的读者可能会问,Golang 语言可以将标准变量声明方式的 4 部分中类型和显式赋初始值同时省略吗?

答案是不可以。Golang 编译器必须至少明确变量的类型或初始值,二者如果都省略,编译器将无法得到变量的类型,从而也就不能根据类型明确变量的内存边界。

短变量声明

以上两种在标准声明变量方式的基础上简化的变量声明方式,都需要使用关键字 var,可能会有读者问可以省略关键字 var 吗?

答案是可以。Golang 语言还有一种最简化的声明变量的方式,短变量声明,使用短变量声明的方式,可以同时省略关键字 var 和变量的类型。

a := 100

阅读上面这段代码,它就是短变量声明,与标准变量声明的方式相比,该方式省略了关键字 var 和变量的类型。但是,细心的读者可能已经发现,= 改为 :=。Golang 编译器可以根据变量的赋值做类型推断,得到变量的类型,从而明确变量的内存边界。

短变量声明的方式虽然是 Golang 语言中最简化的变量声明的方式,但是它也有局限性,它只能用于局部变量声明。

显式类型转换

无论是省略类型显式赋初始值声明变量,还是短变量声明,它们都是 Golang 编译器根据变量的赋值,通过类型推断得出变量的默认类型。

如果我们也不想使用变量的默认类型,那么我们可以通过显式类型转换得到我们想要的变量类型,如下所示:

var a = int8(100)
b := int8(60)

变量列表声明

所有声明变量的方式,都支持变量列表声明。所谓变量列表声明,就是使用 var 关键字,通过一行代码声明多个变量。

var a, b, c int = 100, 200, 300
var d, e, f int
var g, h, i = 400, "你好", true
j, k, l := 500, "世界", 3.14

变量声明块

Golang 语言还支持变量声明块,使用关键字 var 将多个单个变量声明或变量列表声明放在一起,如下所示:

var (
    a int = 100
    b int = 200
)

var (
    c = 300
    d = 3.14
    f = true
)

var (
    e, f, g int = 10, 20, 30
    h, i, j string = "a", "b", "c"
)

03使用场景

我们介绍了多种变量声明的方式,那么每种 Golang 语言变量声明方式的使用场景分别是什么,首先,我们需要先了解 Golang 语言中变量的作用域,分别是包级变量,全局变量和局部变量。

包级变量

包级变量的作用域是只能在同一个 package 中使用。

包级变量,只能使用 var 关键字的变量声明方式,如果变量声明显式初始化,一般会使用省略类型声明变量的方式。

全局变量

全局变量的作用域是在项目的任意位置都可以使用。

如果包级变量的变量名首字母大写,也就是 Golang 语言中的导出变量,那么这个变量就成为全局变量,可以在全局使用。

全局变量,也只能使用 var 关键字的变量声明方式,如果变量声明显式初始化,一般会使用省略类型声明变量的方式。

局部变量

局部变量的作用域是只能在函数体或方法体中使用。

局部变量,一般会优先使用短变量声明的方式,除非不想给局部变量显式初始化,我们可以使用省略类型声明变量的方式。

04注意事项:

函数外的每个语句都必须以关键字开始(var、const、func等);

:= 不能使用在函数外;

_ 多用于占位,表示忽略值;

05总结

本文我们介绍 Golang 语言为什么在使用变量之前,需要先声明变量;Golang 语言有哪些变量声明的方式和 Golang 语言的每种变量声明方式适用于什么场景。

到此这篇关于Golang语言的多种变量声明方式与使用场景的文章就介绍到这了,更多相关Golang多种变量声明与使用场景内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go语言中的变量声明和赋值

    1.变量声明和赋值语法 Go语言中的变量声明使用关键字var,例如 复制代码 代码如下: var name string //声明变量 name = "tom" //给变量赋值 这边var是定义变量的关键字,name是变量名称,string是变量类型,=是赋值符号,tom是值.上面的程序分两步,第一步声明变量,第二步给变量赋值.也可以将两步合到一起. 复制代码 代码如下: var name string = "tom" 如果在声明时同时赋值,可以省略变量类型,Go语

  • Go语言声明一个多行字符串的变量

    Go如何声明一个多行字符串的变量?使用 ` 来包含即可. package main import ( "fmt" ) func main() { str := `hello world v2.0` fmt.Println(str) } Demo:http://play.golang.org/p/BOL8_SwQ0D 以上所述就是本文的全部内容了,希望大家能够喜欢.

  • 详解Golang编程中的常量与变量

    Go语言常量 常量是指该程序可能无法在其执行期间改变的固定值.这些固定值也被称为文字. 常量可以是任何像一个整型常量,一个浮点常量,字符常量或字符串文字的基本数据类型.还有枚举常量. 常量是一样,只是它们的值不能自己定义后进行修改常规变量处理. 整型常量 一个整数文字可以是十进制,八进制,或十六进制常数.前缀指定基或基数:0x或0X的十六进制,0表示八进制,并没有为十进制. 一个整数文字也可以有一个后缀为U和L的组合,分别为无符号和长整型.后缀可以是大写或小写,并且可以以任意顺序. 这里是整数常

  • 关于Golang变量初始化/类型推断/短声明的问题

    视频: https://www.bilibili.com/video/BV1Zh411k7iB/ 声明变量同时初始化 上节我们了解了三种变量声明的语法,并且知道未初始化的变量初始值都是其类型的零值 其实只需要在声明时赋予初始值,即可进行初始化 下面针对三种变量声明语法进行初始化: [1] var name type [2] var name1, name2 type [3] var ( name1 type1 name2 type2 ) 类型推断 如果变量声明时附带初始值,Go会自动推断出初始值

  • Golang常用环境变量说明与设置详解

    无论你是使用Windows,Linux还是Mac OS操作系统来开发Go应用程序,在安装好Go安装语言开发工具之后,都必须配置好Go语言开发所要求的 环境变量,才算初步完成Go开发环境的搭建. 但对于一些初学者来说,可能不太明白Go语言中常用的环境变量(Environment variables)的作用以及如何设置环境变量,今天我们来讲讲. 注意:Go提供的Windows操作系统安装包(.msi后缀)安装完成后,会自动配置几个常用的环境变量. 常用环境变量 Go语言中可以设置的环境变量有很多,每

  • go语言变量定义用法实例

    本文实例讲述了go语言变量定义用法.分享给大家供大家参考.具体如下: var语句定义了一个变量的列表:跟函数的参数列表一样,类型在后面. 复制代码 代码如下: package main import "fmt" var x, y, z int var c, python, java bool func main() {     fmt.Println(x, y, z, c, python, java) } 变量定义可以包含初始值,每个变量对应一个. 如果初始化是使用表达式,则可以省略类

  • GO语言获取系统环境变量的方法

    本文实例讲述了GO语言获取系统环境变量的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "fmt"  "os"  //我们要用到os包中的env ) func main() {  //os.Getenv检索环境变量并返回值,如果变量是不存在的,这将是空的.  HOME:= os.Getenv("HOME")  fmt.Println(HOME)  fmt.Printf(os.Ge

  • Golang语言的多种变量声明方式与使用场景详解

    目录 01介绍 02变量声明方式 标准声明变量 不显式赋初始值声明变量 省略类型声明变量 短变量声明 显式类型转换 变量列表声明 变量声明块 03使用场景 包级变量 全局变量 局部变量 04注意事项: 05总结 01介绍 在程序设计中,编译器必须将代表数据的变量名称替换成该数据所在的内存地址.变量的名称.类型及内存地址通常会维持固定,但该内存地址所存储的数据在程序执行期间则可能会改变. Golang 语言编译器需要先明确变量的内存边界,才可以使用变量.通过声明变量使用的类型,编译器可以明确变量的

  • [c++]变量声明与定义的规则详解

    声明与定义分离 Tips:变量能且仅能被定义一次,但是可以被多次声明. 为了支持分离式编译,C++将定义和声明区分开.其中声明规定了变量的类型和名字,定义除此功能外还会申请存储空间并可能为变量赋一个初始值. extern 如果想声明一个变量而非定义它,就使用关键字extern并且不要显式地初始化变量: extern int i; // 声明i而非定义i extern int i = 1; // 定义i, 这样做抵消了extern的作用 static 当我们在C/C++用static修饰变量或函数

  • Volley源码之使用方式和使用场景详解

    概述 Volley是Google在2013年推出的一个网络库,用于解决复杂网络环境下网络请求问题.刚推出的时候是非常火的,现在该项目的变动已经很少了.项目库地址为https://android.googlesource.com/platform/frameworks/volley 通过提交历史可以看到,最后一次修改距离今天已经有一段时间了.而volley包的release版本也已经很久没有更新了. author JeffDavidson<jpd@google.com> SunMar1316:3

  • Java反射机制原理、Class获取方式以及应用场景详解

    目录 学习背景 一.Java反射机制是什么? 1.1 反射原理 1.2 反射例子 二.Java反射机制中获取Class的三种方式及区别? 2.1 Class的几种获取方式 2.2 代码演示几种方式的区别 三.Java反射机制的应用场景有哪些? 3.1 应用场景 3.2 简单工厂模式优化 3.2.1 什么是简单工厂模式? 3.2.2 简单工厂模式有什么用? 3.2.3 如何实现简单工程模式? 3.2.4 简单工厂模式优化 3.2.5 简单工厂模式再次优化 3.3 代理模式中的动态代理实现 3.3.

  • C语言中回调函数的含义与使用场景详解(2)

    目录 详解C语言中回调函数的含义与使用场景(2) 使用场景一(重定义): 使用场景二(扩展函数功能): 使用场景三(分层): 总结 详解C语言中回调函数的含义与使用场景(2) 引言:在上一篇文章中介绍了回调函数的概念与使用方法,本节将深入地介绍回调函数典型的使用场景.通过使用回调函数可以实现驱动和应用程序的分离解耦,让程序更加地灵活.也可以借助回调函数实现插入自定义代码.分层设计程序的思想. 使用场景一(重定义): 在统一的接口中,动态地改变一个函数的功能.该函数的功能可以是加载参数.或者执行运

  • C语言的各类变量和零值的比较详解

    目录 1.波尔变量和零值比较 2.整形变量和零进行比较 3.浮点变量和零值比较 4.指针和零值比较 总结 1.波尔变量和零值比较 在C语言中本来是不存在bool类型的,但在C99标准中加入了bool类型. 在C99标准中引入了_Bool类型,在vs中将bool类型进行了宏定义,而_Bool类型使微软自己设计的一种类型,在别的编译器上不具有可移植性,故这里我们使用bool类型. 接下来我们进入我们的正题: 假设布尔变量名称为flag,那它与零值的比较在if语句中表示如下: if(flag)   

  • C语言中回调函数的含义与使用场景详解

    目录 举例 动态改变回调函数的实现的方法: 1)编译时直接赋值 2)运行时实现动态注册 3)作为函数参数传递到指定的函数内 总结 举例 在下述程序中函数 test2_cal() 中调用 函数指针 s_cal 指定的函数执行数值的计算.则 s_cal 指定的那些函数就可以看作一个回调函数. typedef int (*my_calculate_t)(int a, int b); static int cal_sum(int a, int b) { printf("now is sum\r\n&qu

  • Golang反射获取变量类型和值的方法详解

    目录 1. 什么是反射 2. reflect.Type 2.1 类型Type和种类Kind 2.2 引用指向元素的类型 2.3 结构体成员类型 3. reflect.Value 3.1 结构体的成员的值 3.2 遍历array.slice 3.3 遍历map 4. 反射的三大定律 4.1 从interface到反射对象 4.2 从反射对象到interface 4.3 通过反射修改对象,该对象值必须是可修改的 1. 什么是反射 反射是程序在运行期间获取变量的类型和值.或者执行变量的方法的能力. G

  • 三种Golang数组拷贝方式及性能分析详解

    目录 测试 测试代码 测试结果 原理分析 copy append 总结 在Go语言中,我们可以使用for.append()和copy()进行数组拷贝,对于某些对性能比较敏感且数组拷贝比较多的场景,我们可以会对拷贝性能比较关注,这篇文件主要是对比一下这三种方式的性能. 测试 测试条件是把一个64KB的字节数组分为64个块进行复制. 测试代码 package test import ( "testing" ) const ( blocks = 64 blockSize = 1024 ) v

随机推荐