【golang】类型推断和变量重声明
类型推断是一种编程语言在编译期自动解释表达式类型的能力。
1.Go语言的类型推断可以带来哪些好处?
在写代码时,我们通过使用Go语言的类型推断会节省敲击次数,而节省下来的键盘敲击次数几乎可以忽略不记。但它真正的好处,往往会体现在我们写代码之后的那些事情上,比如代码重构。
我们依然通过调用一个函数在声明name变量的同时为它赋值,但是这个函数不是flag.String,而是由我们自己定义的某个函数,比如叫getTheFlag。
package main
import ("flag""fmt"
)
func main() {var name = getTheFlag()flag.Parse()fmt.Printf("Hello, %v!\n", *name)
}
func getTheFlag() *string {return flag.String("name", "everyone", "The greeting object.")
}
我们可以用getTheFlag函数包裹(或者说包装)那个对flag.String函数的调用,并把
其结果直接作为getTheFlag函数的结果,结果的类型是*string。
这样一来,var name =右边的表达式,可以变为针对getTheFlag函数的调用表达式
了。这实际上是对“声明并赋值name变量的那行代码”的重构。
我们通常把不改变某个程序与外界的任何交互方式和规则,而只改变其内部实现”的代码修改方式,叫做对该程序的重构。重构的对象可以是一行代码、一个函数、一个功能模块,甚至一个软件系统。
你会发现,你可以随意改变getTheFlag函数的内部实现,及其返回结果的类型,而不用修改main函数中的任何代码。
这个命令源码文件依然可以通过编译,并且构建和运行也都不会有问题。也许你能感觉得到,这是一个关于程序灵活性的质变。
我们不显式地指定变量name的类型,使得它可以被赋予任何类型的值。也就是说,变量name的类型可以在其初始化时,由其他程序动态地确定。
在你改变getTheFlag函数的结果类型之后,Go 语言的编译器会在你再次构建该程序的时候,自动地更新变量name的类型。
Go 语言是静态类型的,所以一旦在初始化变量时确定了它的类型,之后就不可能再改变。这就避免了在后面维护程序时的一些问题。另外,请记住,这种类型的确定是在编译期完成的,因此不会对程序的运行效率产生任何影响。
Go语言的类型推断可以带来哪些好处?
回答:Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。
2.变量的重声明是什么意思?
涉及到短变量声明。通过使用它,我们可以对同一个代码块中的变量进行重声明。
在 Go 语言中,代码块一般就是一
个由花括号括起来的区域,里面可以包含表达式和语句。Go 语言本身以及我
们编写的代码共同形成了一个非常大的代码块,也叫全域代码块。
这主要体现在,只要是公开的全局变量,都可以被任何代码所使用。相对小
一些的代码块是代码包,一个代码包可以包含许多子代码包,所以这样的代
码块也可以很大。接下来,每个源码文件也都是一个代码块,每个函数也是一个代码块,每个
if语句、for语句、switch语句和select语句都是一个代码块。甚至,
switch或select语句中的case子句也都是独立的代码块。
走个极端,我就在main函数中写一对紧挨着的花括号算不算一个代码块?当
然也算,这甚至还有个名词,叫“空代码块”。
变量重声明的前提条件:
- 由于变量的类型在其初始化时就已经确定了,所以对它再次声明时赋予的类型必须与其
原本的类型相同,否则会产生编译错误。 - 变量的重声明只可能发生在某一个代码块中。如果与当前的变量重名的是外层代码块中
的变量,那么就是另外一种含义了。 - 变量的重声明只有在使用短变量声明时才会发生,否则也无法通过编译。如果要在此处
声明全新的变量,那么就应该使用包含关键字var的声明语句,但是这时就不能与同一个
代码块中的任何变量有重名了 。 - 被“声明并赋值”的变量必须是多个,并且其中至少有一个是新的变量。这时我们才可
以说对其中的旧变量进行了重声明。
这样来看,变量重声明其实算是一个语法糖(或者叫便利措施)。它允许我们在使用短变量
声明时不用理会被赋值的多个变量中是否包含旧变量。可以想象,如果不这样会多写不少代
码。
var err error
n, err := io.WriteString(os.Stdout, "Hello, everyone!\n")
我使用短变量声明对新变量n和旧变量err进行了“声明并赋值”,这时也是对后者的重声明。
文章来自郝林老师的《Go语言36讲》
相关文章:
【golang】类型推断和变量重声明
类型推断是一种编程语言在编译期自动解释表达式类型的能力。 1.Go语言的类型推断可以带来哪些好处? 在写代码时,我们通过使用Go语言的类型推断会节省敲击次数,而节省下来的键盘敲击次数几乎可以忽略不记。但它真正的好处,往往会…...
“算法详解”系列第3卷贪心算法和动态规划出版
“算法详解”系列图书共有4卷,目前1到3卷已经出版。最新出版的是第3卷—贪心算法和动态规划。 算法详解 卷3 贪心算法和动态规划 “算法详解”系列图书共有4卷,本书是第3卷—贪心算法和动态规划。其中贪心算法主要包括调度、最小生成树、集群、哈夫曼编…...
CSS前端开发指南:创造精美的用户界面
简介: 《CSS前端开发指南:创造精美的用户界面》是一本旨在帮助读者掌握CSS技术,实现令人惊叹的前端用户界面的实用指南。无论您是初学者还是有经验的开发者,本书都将为您提供全面的知识和实用技巧,帮助您创建引人注目…...
代数学与理论物理中常见的群
代数学与理论物理中常见的群 代数学与理论物理中常见的群 四阶群 六阶群 对称群 二维转动群 三维转动群 三维正交群 群 O3群...
解析xml文件,获取需要的数据并写入txt文件中
_ 话不多说!直接上代码!_ 1、XmlUtil.java xml解析工具类 public class XmlUtil {private static String dicName "";private static String dicValue "";// 用于存储需要的数据private static List<Map<String, Str…...
JavaScript基础 第三天
1.for循环 2.数组的基本使用和操作 3.数组排序 一.for循环 ① 语法:把声明起始值,循环条件,变量值写到一起,让人一目了然 for(变量起始值;终止条件;变量变化量) {// 循环体 }举例: for (let i 0; i < 100; i)…...
2.Redis部署到Windows服务器
1.下载安装包 Redis官网没有提供Windows的安装包,可以去gitHub或者网上去下载Redis的Windows安装包。 2.Redis部署到服务器 将Redis整个文件夹放到服务器的指令目录,然后进行修改Redis的配置文件 redis.windows.conf,修改里面的配置项 1.b…...
【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Go语言基础: 有参函数Func、Map、Strings详细案例教程
目录标题 一、Variadic Functions1.Syntax2.Examples and understanding how variadic functions work3.Slice arguments vs Variadic arguments 仅改变可变参数4.Gotcha 二、Map1.Create a Map2.Retrieving value for a key from a map3.Checking if a key exists4.Iterate ov…...
JDBC连接数据库如何实现你会吗???
1.首先建立一个maven项目。。。详细过程来了哇 还没有安装maven的童鞋可以看这里:maven的下载安装与配置环境变量!!!(全网最详细)_明天更新的博客-CSDN博客 有很多小伙伴就有疑问啦,难道我直接…...
C#与C++交互(2)——ANSI、UTF8、Unicode文本编码
【前言】 我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们…...
SQLSTATE[42000]: this is incompatible with sql_mode=only_full_group_by in
执行 SELECT *FROM test WHERE id>1 GROUP BY name having AVG(age)>10 ORDER BY id desc limit 1 提示错误 Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause…...
企业权限管理(五)-订单分页
订单分页查询 PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。 PageHelper使用 集成 引入分页插件有下面2种方式,推荐使用 Maven …...
Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型
推荐:使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 此教程适合新手用户,专业人士直接可直接绕路。 本教程中介绍了利用Blender建模软件,只需要简单几步就可以为模型添加材质贴,图,并且导出带有材质的模型文…...
MySQL不走索引的情况分析
未建立索引 当数据表没有设计相关索引时,查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…...
安装ubuntu22.04系统,配置国内源以及ssh远程登录
一、安装ubuntu22.04系统 原文连接:Ubuntu操作系统22.04版本安装教程-VMware虚拟机_wx63f86e949a470的技术博客_51CTO博客 1.点击界面左侧的开启此虚拟机,即可进入Ubuntu操作系统安装界面,点击Try or Install Ubuntu 即可开始安装 …...
win10 安装ubuntu子系统并安装宝塔
1、安装子系统 2、ubuntu 中安装宝塔 这里需要注意的: 大部分文章上写的是“面板账户登录信息”不能直接访问,要改成127.0.0.1:8888去访问。 这种情况适合“面板账户登录信息”端口就是8888。 想我的就是32757 这时你就要用 http://127.0.0…...
gazebo 导入从blender导出的dae等文件
背景: gazebo 模型库里的模型在我需要完成的任务中不够用,还是得从 solidworks、3DMax, blender这种建模软件里面在手动画一些,或者去他们的库里面在挖一挖。 目录 1 blender 1-1 blender 相关links 1-2 install 2 gazebo导入模型 2-1 g…...
目标检测YOLOv3基于DarkNet53模型测试-笔记
目标检测YOLOv3基于DarkNet53模型测试-笔记 预测和试测结果: 预测代码如下所示: testInsects.py #YOLOv3网模型测试-单图片文件测试并显示测试结果 import time import os import paddle import numpy as np import cv2 import random from PIL impor…...
Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设
废话少说,直接上代码。 using UnityEditor; using UnityEngine;public class FindDependencies : MonoBehaviour {static bool m_bIsSaveFile false;static TextWriteHelper m_szMaterialList new TextWriteHelper();static TextWriteHelper m_szPrefabList new…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
