Go语言变量创建的五种方法

对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的。

Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。

变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。

声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可。

第一种:一行声明一个变量

var <name> <type>

其中 var 是关键字(固定不变),name 是变量名,type 是类型。

使用 var ,虽然只指定了类型,但是 Go 会对其进行隐式初始化,比如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil。

若想在声明过程,顺便也初始化,可以这样写

var name sting = "Python编程"

在 Go 文件中的完整代码如下,为了不写重复性的代码,后续不再貼完整代码,只貼关键代码

package main

import "fmt"

func main() {
 var name string = "Python编程时光"
 fmt.Println(name)
}

从右值(等号右边的值,rvalue)来看,明显是个 string 类型(这里要注意,在 Python 双引号与单引号等价,但在 Go 中双引号和单引号是不一样的,这里要一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符,这个后续会单独介绍),因此也可以将其简化为

var name = "Python编程"

若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,但是很多情况下,我们并不需要这么高的精度(占用的内存空间更大)

这种情况下,推荐指定类型,不要偷懒

var rate float32 0.89

第二种:多个变量一起声明

声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样

var (
 name string
 age int
 gender string
)

第三种:声明和初始化一个变量

使用 := (推导声明写法或者短类型声明法:编译器会自动根据右值类型推断出左值的对应类型。),可以声明一个变量,并对其进行(显式)初始化。

name := "Python编程"
// 等价于
var name string = "Python编程"
// 等价于
var name = "Python编程"

但这种方法有个限制就是,只能用于函数内部

第四种:声明和初始化多个变量

name, age := "wangbm", 28

这种方法,也经常用于变量的交换

var a int = 100
var b int = 200
b, a = a, b

第五种:new 函数声明一个指针变量

在这里要先讲一下,指针的相关内容。

变量分为两种 普通变量 和 指针变量

普通变量,存放的是数据本身,而指针变量存放的是数据的地址。

如下代码,age 是一个普通变量,存放的内容是 28,而 ptr 是 存放变量age值的内存地址:0xc000010098

package main
import "fmt"
func main() {
 var age int = 28
 var ptr = &age // &后面接变量名,表示取出该变量的内存地址
 fmt.Println("age: ", age)
 fmt.Println("ptr: ", ptr)
}

输出

age:  28
ptr:  0xc000010098

而这里要说的 new 函数,是 Go 里的一个内奸函数。

使用表达式 new(Type) 将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为 *Type 。

package main
import "fmt"
func main() {
 ptr := new(int)
 fmt.Println("ptr address: ", ptr)
 fmt.Println("ptr value: ", *ptr) // * 后面接指针变量,表示从内存地址中取出值
}

输出

ptr address:  0xc000010098
ptr value:  0

用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。

如下两种写法,可以说是等价的

// 使用 new
func newInt() *int {
 return new(int)
}
// 使用传统的方式
func newInt() *int {
 var dummy int
 return &dummy
}

以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。

但也有例外,这就要说到一个特殊变量: 匿名变量 ,也称作占位符,或者空白标识符,用下划线表示。

匿名变量,优点有三:

  • 不分配内存,不占用内存空间
  • 不需要你为命名无用的变量名而纠结
  • 多次声明不会有任何问题

通常我们用匿名接收必须接收,但是又不会用到的值。

func GetData() (int, int) {
 return 100, 200
}
func main(){
 a, _ := GetData()
 _, b := GetData()
 fmt.Println(a, b)
}

补充:本内容主要讲了GO语言快速的5个特征:

  • 值存储(有效的值处理和值存储,内存消耗少);
  • 函数调用(采用Inlining内联优化技术)
  • 强制的垃圾回收机制(转义化分析,如果没有引用,则进行回收);
  • Go进程
  • 堆栈管理(若旧内存太小,会重新分配新的大的堆栈,并复制旧内容到新内容中去)

总结

以上所述是小编给大家介绍的Go语言五种变量创建的方法,希望对大家有所帮助!

(0)

相关推荐

  • Go语言基础知识总结(语法、变量、数值类型、表达式、控制结构等)

    一.语法结构 golang源码采用UTF-8编码.空格包括:空白,tab,换行,回车. - 标识符由字母和数字组成(外加'_'),字母和数字都是Unicode编码. - 注释: 复制代码 代码如下: /* This is a comment; no nesting */ // So is this. 二.字面值(literals)类似C语言中的字面值,但数值不需要符号以及大小标志: 复制代码 代码如下: 23 0x0FF 1.234e7类似C中的字符串,但字符串是Unicode/UTF-8编码的

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

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

  • C++跳转语句之Goto对变量定义的影响详解

    前言 goto语句也称为无条件转移语句,其基本形式如下 : 语句标号由一个有效地标识符和符号";"组成,其中,标识符的命名规则与变量名称相同,即由字母.数字和下划线组成,且第一个字符必须是字母或下划线.执行goto语句后,程序就会跳转到语句标号处,并执行其后的语句. 通常goto语句与if条件语句连用,但是,goto语句在给程序带来灵活性的同时,也会使得使程序结构层次不清,而且不易读,所以要合理运用该语句. 发现问题 我们经常碰到有在goto后面定义变量,linux下编译不通过的问题(

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

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

  • django开发之settings.py中变量的全局引用详解

    本文主要介绍的是django中settings.py中变量的全局引用的相关资料,下面话不多说,来看看详细的介绍吧. 前言 在settings.py中添加自定义变量,可以通过setting.(点)变量名的方式访问,如: from django.conf import settings site_name = settings.SITE_NAME site_desc = settings.SITE_DESC 但是,如果遇到了一些频繁访问的变量,如:邮箱,网站标题,网站的描述,这样访问就很不方便. 解

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

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

  • Go语言变量创建的五种方法

    对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的. Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型. 变量在使用前,需要先声明.声明类型,就约定了你这个变量只能赋该类型的值. 声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可. 第一种:一行声明一个变量 var <name> <type> 其中 var 是关键字

  • 详解Go语言中用 os/exec 执行命令的五种方法

    完整系列教程详见:http://golang.iswbm.com 在 Golang 中用于执行命令的库是 os/exec,exec.Command 函数返回一个 Cmd 对象,根据不同的需求,可以将命令的执行分为三种情况 只执行命令,不获取结果 执行命令,并获取结果(不区分 stdout 和 stderr) 执行命令,并获取结果(区分 stdout 和 stderr) 第一种:只执行命令,不获取结果 直接调用 Cmd 对象的 Run 函数,返回的只有成功和失败,获取不到任何输出的结果. pack

  • R语言将变量分组的3种方法实例(含cut函数说明)

    目录 前言 方法一:直接对分组变量进行赋值 方法二:使用within函数对变量进行分组 方法三:采用cut函数 总结 前言 在数据处理的过程中,我们有时候需要将连续的数值数据转换为类别数据,比如将收入分成高.中和低三组,将学生成绩分为优.良.中.及格和不及格五组. 本来将基于R语言,采用三种方法来实现:第一种是对变量直接进行重新赋值,第二种是使用within函数对语句进行组织,第三种是cut函数. 首先我们定义一个数据框,这个数据框包括学生姓名和数学成绩两个变量. #定义数据框 mathScor

  • 一文搞懂Java创建线程的五种方法

    目录 题目描述 解题思路 代码详解 第一种 继承Thread类创建线程 第二种:实现Runnable接口创建线程 第三种:实现Callable接口,通过FutureTask包装器来创建Thread线程 第四种:使用ExecutorService.Callable(或者Runnable).Future实现返回结果的线程 第五种:使用ComletetableFuture类创建异步线程,且是据有返回结果的线程 题目描述 Java创建线程的几种方式 Java使用Thread类代表线程,所有线程对象都必须

  • JavaScript数组去重的五种方法

    javascript数组去重是一个比较常见的需求,解决方法也有很多种,网上都可以找到答案的,下面小编给大家整理了一份关于同类型的数组去重的方法,先给大家介绍下简单实现思路. 思路: 遍历数组,一一比较,比较到相同的就删除后面的 遍历数组,一一比较,比较到相同的,跳过前面重复的,不相同的放入新数组 任取一个数组元素放入新数组,遍历剩下的数组元素任取一个,与新数组的元素一一比较,如果有不同的,放入新数组. 遍历数组,取一个元素,作为对象的属性,判断属性是否存在 1. 删除后面重复的: functio

  • python中调试或排错的五种方法示例

    前言 本文主要给大家介绍了关于python中调试或排错的五种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的的介绍吧 python调试或排错的五种方法 1.print,直接打印,比较简单而且粗暴 在代码中直接输入print+需要输出的结果,根据打印的内容判断即可 2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多 如下,直接将预期结果和实际结果做判断 def true_code(): x = 3 y = 2 z = x + y assert(5==z), "z

  • ASP.NET Core设置URLs的五种方法

    目录 前言 URL格式 前提条件 方法1 使用环境变量 方法2 使用命令行参数 方法3 使用配置文件 方法4 使用UseUrls 方法5 使用Kestrel 优先级 总结 前言 在使用ASP.NET Core 3.1开发时,需要配置服务器监听的端口和协议,官方帮助文档进行简单说明,文档中提到了4种指定URL的方法 设置ASPNETCORE_URLS 环境变量: 使用dotnet --urls 命令行参数: 使用urls作为键进行配置: 使用UseUrls扩展方法: 为便于讲清楚URLs设置方法,

  • Python实现求解最大公约数的五种方法总结

    目录 方法一:短除法 方法二:欧几里得算法(辗转相除法) 方法三:更相减损术 方法四:穷举法(枚举法) 方法五:Stein算法 求最大公约数是习题中比较常见的类型,下面小编会给大家提供五种比较常见的算法,记得帮忙点个赞哦! 一般来说,最大公约数的求法大概有5种 方法一:短除法 短除法是求最大公因数的一种方法,也可用来求最小公倍数.求几个数最大公因数的方法,开始时用观察比较的方法,即:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数.后来,使用分解质因数法来分别分解两个数的因

  • Python实现将内容写入文件的五种方法总结

    目录 一.write()方法 二.writelines() 方法 三.print() 函数 四.使用 csv 模块 五.使用 json 模块 一.write()方法 使用 write() 方法:使用 open() 函数打开文件,然后使用 write() 方法将内容写入文件.例如: with open('example.txt', 'w') as f: f.write('Hello, world!') open() 函数是 Python 内置的用于打开文件的函数,其常用的参数及其含义如下: 1.f

  • 浅谈基于SQL Server分页存储过程五种方法及性能比较

    在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userName nvarchar(20) not null, userPWD nvarchar(20) not null, u

随机推荐