Go-知识简短变量声明

news2024/10/6 15:29:21

Go-知识简短变量声明

  • 1. 简短变量声明符
  • 2. 简短变量赋值可能会重新声明
  • 3. 简短变量赋值不能用于函数外部
  • 4. 简短变量赋值作用域问题
  • 5. 总结

githuio地址:https://a18792721831.github.io/

1. 简短变量声明符

在Go语言中,可以使用关键字var或直接使用简短变量声明符:=声明变量。
相比而言,使用:=更多一些,而且使用:=可以自动推断类型,而不需要关注类型问题。
比如:

    a := "string"
    a := 2
    a := struct{}

2. 简短变量赋值可能会重新声明

使用:=可能会重新声明变量,导致出现在不同的作用域中,很可能创建了新的同名变量,导致同一个函数不同作用域的同名变量不符合预期。
多说无益,请看如下代码:

func TestTmpVar(t *testing.T) {
	a := 1
	a++
	fmt.Printf("a=%d\n", a)
	if a > 0 {
		a, err := addNum(a)
		if err != nil {
			fmt.Printf("err=%s", err)
		}
		fmt.Printf("a=%d\n", a)
	}
	fmt.Printf("a=%d\n", a)
}
func addNum(a int) (int, error) {
	return a + 1, nil
}

请想想上述代码输出结果是什么?
在这里插入图片描述

上面的写法非常常见,使用:=调用了一个函数,然后接收函数返回的结果,如果有错误,那么处理错误,没有错误,那么将结果赋值给变量。
但是要非常注意,因为a已经在外部声明了,而方法调用又是在if内部,所以就相当于在if内,创建了一个同名函数,并没有按照我们的预期处理。
如果a是指针,那么,后面在使用a的时候,肯定会出现空指针panic
为什么会出现这样的问题呢?
这是因为:=的规则:

:=左侧存在新变量时(err),已声明的变量(a)会被重新声明,不会有其他额外的副作用。
:=左侧没有新变量是不允许的,编译会提示no new variable on left side of :=

所以如果当一个变量第一次声明和后续全部使用过程中,都在同一个作用域内时,上述使用确不会出现问题,因为作用域相同。
比如上述代码如果去掉if

func TestTmpVar(t *testing.T) {
	a := 1
	a++
	fmt.Printf("a=%d\n", a)
	//if a > 0 {
	a, err := addNum(a)
	if err != nil {
		fmt.Printf("err=%s", err)
	}
	fmt.Printf("a=%d\n", a)
	//}
	fmt.Printf("a=%d\n", a)
}
func addNum(a int) (int, error) {
	return a + 1, nil
}

输出如下
在这里插入图片描述

因为虽然使用:=重新定义了新的变量,但是在后面使用的过程中,使用的也是新的变量。

3. 简短变量赋值不能用于函数外部

简短变量赋值只能用于函数内,不能使用:=来声明和初始化全局变量。
比如:

package study
test := "test"

会出现编译错误,提示为syntax error: non-declaration statement outside function body
可以理解为:=实际上会拆分成两个语句,一个是声明,一个是赋值。而赋值语句不允许出现在函数外部。

4. 简短变量赋值作用域问题

考虑最开始的例子,假设变量时指针类型。

type tes struct {
	a int
	z string
}

func TestTmpStruct(t *testing.T) {
	a := tes{
		a: 1,
		z: "1",
	}
	a.a++
	fmt.Printf("a = %+v, %#p\n", a, &a)
	if a.a > 0 {
		a, err := addNumStruct(a)
		if err != nil {
			fmt.Println(err)
		}
		fmt.Printf("a = %+v, %#p\n", a, &a)
	}
	fmt.Printf("a = %+v, %#p\n", a, &a)
}
func addNumStruct(a tes) (tes, error) {
	a.a++
	return a, nil
}

查看输出,可以很明显的看到创建了新的变量:
在这里插入图片描述

那么新的问题来了,假设不是if,而是for那么:
在这里插入图片描述

可以很明显的看到创建了很多的变量,这些变量属于for作用域内的临时变量,当大量生成临时变量时,
虽然Go不需要我们管理内存,但是会导致程序性能的下降。

5. 总结

简短变量声明操作符:=虽然很好用,但是需要注意:=的特性,在使用的时候,需要避免因为使用:=而导致的同名变量声明,以及作用域内无效变量的声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1493587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024新鲜出炉阿里巴巴面试真题,如果不想35岁被淘汰这篇文章必看

最近看到群里看到一个女生,讲述了她从开始选择Android,经过非常努力的学习和挣扎,然而最后面对当前的环境却不得不放弃。看完以后真的非常替她感觉惋惜,如果早几年入行可能结果会比现在好很多,但可惜,这就是…

Thinkphp5.1中,将数组赋值给js使用

一、例如Thinkphp5.1中的的代码是这样的 $data [status > 1,msg > 加载成功,data > [id > 1,username > 小洪帽,] ];$this->assign(data,$data);二、JS代码接收PHP中的数组 注意 <> 符号是不需要放引号的。 let arr <?json_encode($data)?>…

MySql、Navicat 软件安装 + Navicat简单操作(建数据库,表)

一、MySql、Navicat 软件安装 及正常使用 MySql下载&#xff0b;安装&#xff1a; 检查安装情况&#xff1a; 配置环境变量&#xff1a; 搞定了&#xff01;&#xff01;&#xff01; 可以登陆试哈哈哈 连接navicat 开始创建数据库 二、 商品种类表 - commoditytype int …

CSS极速入门

CSS介绍 什么是CSS? CSS(Cascading Style Sheet),层叠样式表,用于控制页面的样式. CSS能够对网页中元素位置的排版进行像素级的精确控制,实现美化页面的效果.能够做到页面的样式和结构分离. CSS可以理解为"东方四大邪术"的化妆术. 对页面展示进行化妆. 基本语法规…

双指针解决三元组问题

山海自有归期 风雨自有相逢 CSDN 请求进入专栏 ​​​​ 是否进入《数据结构专栏》? 确定 目录 三数之和 题目描述 输入输出样例 思路 代码测试 复杂度分析 三数之和 题目链接&#xff1a;三数之和 题目描述 给你一个整数数组 nums &#…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…

初探深度学习-手写字体识别

前言 手写数字的神经网络识别通常指的是通过训练有素的神经网络模型来识别和分类手写数字图像的任务。这种类型的任务是机器学习和计算机视觉领域的一个经典问题&#xff0c;经常作为入门级的图像识别问题来展示和测试各种机器学习算法的能力。在实际应用中&#xff0c;手写数…

比肩Gen-2,全新开源文生视频模型

著名开源平台Stability.ai在官网宣布&#xff0c;推出全新文生视频的扩散模型Stable Video Diffusion&#xff0c;已开源了该项目并公布了论文。 据悉&#xff0c;用户通过文本或图像就能生成高精准&#xff0c;14帧和25帧的短视频。目前&#xff0c;Stable Video Diffusion处…

为 OpenBMC 添加一个新的系统

1. 前言 在上一篇文章中向大家介绍了 OpenBMC 的是什么以及它的作用和应用场景&#xff0c;并且以一个自带的示例平台 romulus 展示了从下载源码包开始到启动系统并访问 Web 控制页面的整体构建流程。 通过前文已经了解到如何为已有的平台构建系统镜像&#xff0c;下面我们来…

如何使用LEAKEY轻松检测和验证目标服务泄露的敏感凭证

关于LEAKEY LEAKEY是一款功能强大的Bash脚本&#xff0c;该脚本能够检测和验证目标服务中意外泄露的敏感凭证&#xff0c;以帮助广大研究人员检测目标服务的数据安全状况。值得一提的是&#xff0c;LEAKEY支持高度自定义开发&#xff0c;能够轻松添加要检测的新服务。 LEAKEY主…

自动灭火贴有用吗?搞清楚自动灭火贴的使用范围很关键!

近年来&#xff0c;伴随着新能源车辆的自燃案例频频发生&#xff0c;许多新型自动灭火产品走红网络。灭火球、灭火宝、灭火手雷......层出不穷的新型产品褒贬各异&#xff0c;哪怕是目前占领市场份额较多的自动灭火贴也不乏有人心里嘀咕&#xff1a;自动灭火贴好用吗&#xff1…

什么是Docker容器?

Docker是一种轻量级的虚拟化技术&#xff0c;同时是一个开源的应用容器运行环境搭建平台&#xff0c;可以让开发者以便捷方式打包应用到一个可移植的容器中&#xff0c;然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机&#xff0c;Docker容器提供轻量化的…

Linux编程3.3 进程-进程的终止

1、正常终止 从main函数返回调用exit(标准C库函数)调用_exti或_Exit&#xff08;系统调用&#xff09;最后一个线程从其启动例程返回最后一个线程调用 pthread exit 2、异常终止 调用abort接受到一个信号并终止最后一个线程对取消请求做处理响应 3、进程返回 通常程序运行…

谷歌Gemini批量多线程写原创文章API软件-支持双标题违禁词过滤

谷歌Gemini批量多线程写原创文章软件介绍&#xff1a; 1、Gemini 是谷歌筹备了一年之久的GPT4真正竞品&#xff0c;也是目前谷歌能拿出手的功能最为强悍、适配最为灵活的大模型。 2、谷歌Gemini目前免费申请key&#xff0c;key没有额度限制&#xff0c;可以一直写文章。 3、谷…

Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出 cairo的surface可以是pixbuf, 可以是screen, 可以是png图&#xff0c;也可以是pdf文件 、svg文件、ps文件&#xff0c;定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图&#xff0c;如果surface是p…

LeetCode-第137题-只出现一次的数||

1.题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 2.样例描述 3.思路描述 先把数组排序&am…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟&#xff1a;“师兄&#xff0c;我又被鄙视了。说我的系统太差&#xff0c;测试不过关。” 我&#xff1a;“怎么说&#xff1f;” 师弟&#xff1a;“每次发布版本给程夏&#xff0c;都被她发现一些bug&#xff0c;太丢人了。师兄&#xff0c;有什么方法来衡量测试的…

vue2源码分析-vue入口文件global-api分析

文章背景 vue项目开发过程中,首先会有一个初始化的流程,以及我们会使用到很多全局的api,如 this.$set this.$delete this.$nextTick,以及初始化方法extend,initUse, initMixin , initExtend, initAssetRegisters 等等那它们是怎么实现,让我们一起来探究下吧 源码目录 global-…

2024年展望Android原生开发的现状,2024网易Android高级面试题及答案

没有稳定的工作&#xff0c;只有稳定的能力。 又到了万物复苏的季节&#xff0c;在程序猿这个行当里&#xff0c;作为 Android 开发出生的&#xff0c;在经历了八年的脱发生涯后&#xff0c;有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起&#xff0c;在 ReactNati…

基于SpringBoot+Vue实现的人力资源管理系统

系统介绍&#xff1a; 基于SpringBootVue实现的人力资源管理系统是为了提高企业人力资源管理水平而开发的。主要目标是通过对员工及人力资源活动信息&#xff08;考勤、工资)等的编制来提高企业效率。 系统一共分为五大菜单项&#xff0c;分别是首页、薪资管理、权限管理、系统…