Go-知识简短变量声明

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. 总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

医疗行业数据分析,为医疗提质增效提供科学支持

信息化时代的到来,医疗行业数据分析已成为提升医疗服务质量和效率的重要手段。医院拥有大量的医疗数据,医疗数据中包含着很多宝贵的信息与规律,通过深入的数据分析,能够为决策者提供直观、深入的数据洞察,帮助医疗服务…

vmware 中虚拟机Ubuntu磁盘不够,扩展磁盘,并分配

vmware 中虚拟机Ubuntu磁盘不够,扩展磁盘,并分配 Ubuntu虚拟机处于关机状态。虚拟机 -> 设置 ->硬盘 ->扩展 ,可以直接多给点,这里只是做演示。 3.开启虚拟机,一般不会报错,我这里报错了&#…

ue4.27 发现 getRandomReachedLocation 返回 false

把这个玩意儿删掉,重启工程,即可 如果还不行 保证运动物体在 volum 内部,也就是绿色范围内确保 project setting 里面的 navigation system 中 auto create navigation data 是打开的(看到过博客说关掉,不知道为啥) 如果还不行&…

【深度优先搜索】【树】【C++算法】2003. 每棵子树内缺失的最小基因值

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 深度优先搜索 LeetCode2003. 每棵子树内缺失的最小基因值 有一棵根节点为 0 的 家族树 ,总共包含 n 个节点,节点编号为 0 到 n - 1 。给你一个下标从 0 开始的整数数组 parents ,其中…

AXI4的网格设计Block Design

一、引出时钟和时钟复位 然后同样的把主接口和从接口的两个时钟和两个reset信号连接在一起。 二、分配地址 三、验证设计 点击图中的Validate Design验证设计,如果不对的话会有报错 报错如下 四、Generate Output Product和Creat HDL Wrapper 4.1 Generate Output…

设计模式之策略模式详解

目录 什么是策略模式 应用场景 业务场景实现 抽象类 实现类 Context上下文 测试类 策略模式的优缺点 什么是策略模式 他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。 策略模式使用的就是…

【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)

字符流练习 练习1:文件夹拷贝1.1 需求1.2 代码实现1.3 输出结果 练习2:文件加密与解密2.1 需求2.2 代码实现2.3 输出结果 练习3:修改文件数据(常规方法)3.1 需求3.2 代码实现3.3 输出结果 练习4:修改文件数…

最小高度树-力扣(Leetcode)

题目链接 最小高度树 思路:本质上是找到树中的最长路径。当最长路径上中间点(若路经长为偶数,则中间点仅有一个,否者中间点有两个)作为根时,此时树高最小。 Code: class Solution { public://拓扑排序int…

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商,武汉灰京文化注重多样化的推广策略,通过与各大媒体、社交平台和游戏社区建立紧密的合作关系,为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式,将游戏信息传播给…

Unity曲柄滑块四杆机构运动计算

一、运动效果 二、机构的介绍 曲柄长度:a,线段AB长度 连杆长度:b,线段BC长度 偏心距离:e,滑块轨迹与曲柄中心点A的垂直距离 三、已知点A点B和e的值,计算C点的位置 1、计算s的值 var h math.…

阻塞队列介绍

阻塞队列 kafka是目前来说性能最好的消息队列服务器,能处理TB级别的数据 作用:点赞、评论时,服务器会自动给某个用户发送通知 kafka是个框架,如果不用框架还要解决类似问题,就要用到阻塞队列 BlockingQueue 阻塞队列就是一个…

【C++】vector 的常用接口

目录 一、vector是什么❓ 二、vector的使用 1、构造函数 2、修改数据 ⭕️size ⭕️capacity ⭕️empty ⭕️clear ⭕️resize(重要) ⭕️reserve(重要) ​3、遍历数据 ⭕️operator[ ] (重要) …

35 Spring整合Elasticsearch

文章目录 Spring整合Elasticsearch引入依赖配置Elasticsearch解决冲突 使用ElasticsearchSpring Data Elasticsearch建立映射关系常用方法添加数据修改数据删除数据搜索数据(es核心)步骤构造搜索条件 并 应用进行查询使用查询结果 Spring整合Elasticsear…

wps没保存关闭了怎么恢复数据?恢复文件教程

Microsoft Word是我们不可或缺的工具。很多小伙伴都遇到在WPS中编辑文件时,它可能会突然闪退,或者忘记及时保存文件就直接关闭了,导致我们辛苦编辑的文档丢失。面对这种情况我们该如何应对,尽量减小损失呢?接下来让我为…

is_sorted()函数的练习

仅是用来巩固训练verctor容器与is_sorted()、next_permutation()函数 #include <bits/stdc.h> using namespace std;bool cmp1(int a,int b){if(a>b)return true;return false; } bool cmp2(int a,int b){if(a<b)return true;return false; } int main(){vector<…

博客笔记项目的自动化测试

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;测试开发项目 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录 …

Mongodb基础(node.js版)

一、Mongodb 介绍 Mongodb 是一个文档数据库&#xff0c;以文档形式存储数据&#xff0c;格式类似于 JSON 与 Mysql 的特点及选型对照 MongodbMysql关系类型非关系型关系型存储类型文档存储&#xff08;类似于写 Word &#xff09;表格存储 &#xff08;类似于写 Excle&…

浙江大学主办!2024年第7届信息通信与信号处理国际会议( ICICSP2024)征稿开启!

会议官网 IEEE | ICICSP 2024 学术会议查询-学术会议交流服务平台-爱科会易 (uconf.com)​www.uconf.com/

Day12:信息打点-Web应用源码泄漏开源闭源指纹识别GITSVNDS备份

目录 开源-CMS指纹识别源码获取方式 闭源-习惯&配置&特性等获取方式 闭源-托管资产平台资源搜索监控 思维导图 章节点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接口/微…

17.来自Sora的夺舍妄想——享元模式详解

OpenAI 的 Sora 模型面世之后&#xff0c;可以说人类抵御AI的最后阵地也沦陷了。 在此之前&#xff0c;人们面对AI交互式对话&#xff0c;AI制图&#xff0c;AI建模之类的奇迹时&#xff0c;还可以略微放肆的说&#xff1a;“的确很神奇&#xff0c;这毕竟还是比人类世界低了一…