go语言下划线、变量和常量

1、下划线

“_”是特殊标识符,用来忽略结果。

1.1. 下划线在import中

 在Golang里,import的作用是导入其他package。

   import 下划线(如:import hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。这个时候就可以使用 import 引用该包。即使用【import _ 包路径】只是引用该包,仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数。 示例:

代码结构

    src |+--- main.go            |+--- hello|+--- hello.go
package mainimport _ "./hello"func main() {// hello.Print() //编译报错:./main.go:6:5: undefined: hello
}

hello.go

package helloimport "fmt"func init() {fmt.Println("imp-init() come here.")
}func Print() {fmt.Println("Hello!")
}

输出结果:

    imp-init() come here.

两种不一样的导入方式例子

    import "database/sql"import _ "github.com/go-sql-driver/mysql"

第二个import就是不直接使用mysql包,只是执行一下这个包的init函数,把mysql的驱动注册到sql包里,然后程序里就可以使用sql包来访问mysql数据库了。

1.2. 下划线在代码中

package mainimport ("os"
)func main() {buf := make([]byte, 1024)f, _ := os.Open("/Users/***/Desktop/text.txt")defer f.Close()for {n, _ := f.Read(buf)if n == 0 {break    }os.Stdout.Write(buf[:n])}
}

解释1:

    下划线意思是忽略这个变量.比如os.Open,返回值为*os.File,error普通写法是f,err := os.Open("xxxxxxx")如果此时不需要知道返回的错误值就可以用f, _ := os.Open("xxxxxx")如此则忽略了error变量

解释2:

    占位符,意思是那个位置本应赋给某个值,但是咱们不需要这个值。所以就把该值赋给下划线,意思是丢掉不要。这样编译器可以更好的优化,任何类型的单个值都可以丢给下划线。这种情况是占位用的,方法返回两个结果,而你只想要一个结果。那另一个就用 "_" 占位,而如果用变量的话,不使用,编译器是会报错的。

2、变量

2.1. 变量声明

Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。并且Go语言的变量声明后必须使用。

2.2. 标准声明

Go语言的变量声明格式为:

    var 变量名 变量类型

变量声明以关键字var开头,变量类型放在变量的后面,行尾无需分号。 举个例子:

    var name stringvar age intvar isOk bool

2.3. 批量声明

每声明一个变量就需要写var关键字会比较繁琐,go语言中还支持批量变量声明:

    var (a stringb intc boold float32)

2.4. 变量的初始化

Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil

当然我们也可在声明变量的时候为其指定初始值。变量初始化的标准格式如下:

    var 变量名 类型 = 表达式

举个例子:

    var name string = "pprof.cn"var sex int = 1

或者一次初始化多个变量

    var name, sex = "pprof.cn", 1
类型推导

有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。

    var name = "pprof.cn"var sex = 1
短变量声明

在函数内部,可以使用更简略的 := 方式声明并初始化变量。

package mainimport ("fmt"
)
// 全局变量m
var m = 100func main() {n := 10m := 200 // 此处声明局部变量mfmt.Println(m, n)
}
匿名变量

在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线_表示,例如:

func foo() (int, string) {return 10, "Q1mi"
}
func main() {x, _ := foo()_, y := foo()fmt.Println("x=", x)fmt.Println("y=", y)
}

匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。 (在Lua等编程语言里,匿名变量也被叫做哑元变量。)

注意事项:

    函数外的每个语句都必须以关键字开始(var、const、func等):=不能使用在函数外。_多用于占位,表示忽略值。

3. 常量

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。 常量的声明和变量声明非常类似,只是把var换成了const,常量在定义的时候必须赋值。

    const pi = 3.1415const e = 2.7182

声明了pie这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。

多个常量也可以一起声明:

    const (pi = 3.1415e = 2.7182)

const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。 例如:

    const (n1 = 100n2n3)

上面示例中,常量n1、n2、n3的值都是100

3.1. iota

iotago语言的常量计数器,只能在常量的表达式中使用。 iotaconst关键字出现时将被重置为0const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

举个例子:

    const (n1 = iota //0n2        //1n3        //2n4        //3)

3.2. 几个常见的iota示例:

使用_跳过某些值

    const (n1 = iota //0n2        //1_n4        //3)

iota声明中间插队

    const (n1 = iota //0n2 = 100  //100n3 = iota //2n4        //3)const n5 = iota //0

定义数量级 (这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8。)

    const (_  = iotaKB = 1 << (10 * iota)MB = 1 << (10 * iota)GB = 1 << (10 * iota)TB = 1 << (10 * iota)PB = 1 << (10 * iota))

多个iota定义在一行

    const (a, b = iota + 1, iota + 2 //1,2c, d                      //2,3e, f                      //3,4)

参考文章:

https://www.fansimao.com/928438.html

https://www.fansimao.com/928451.html

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

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

相关文章

IDEA 创建maven项目没有src

环境&#xff1a; IntelliJ IDEA 2022.3.3 (Ultimate Edition) JDK 17 Windows 11 10.0 Maven 3.9.5 创建maven项目的时候没有src目录 试过网上说的重新配置maven库&#xff0c;增加vm-options&#xff0c;并没有什么用。直到我看见了 正常创建就好了。

[计算机提升] 清理系统盘的前期准备

5.1 清理系统盘的前期准备 5.1.1 系统盘之殇&#xff1a;为什么系统盘会越来越大 在windows系统中&#xff0c;系统盘一般是C盘&#xff0c;随着电脑使用时间变长&#xff0c;系统盘会变得越来越大。而系统盘通常在安装系统时已经固定好了&#xff0c;如果系统盘的剩余空间太…

【前端基础--1】

为后面爬虫打基础 使用Visual Studio Code&#xff08;VS Code&#xff09; https://code.visualstudio.com/#alt-downloads 网页基础 创建一个html网页 新建一个文件 文件名后缀.html 书写网页模板 html:5 回车键&#xff08;或者Tab键&#xff09;英文感叹号! 回…

接收邮件触发器

无代码自动化-接收邮件触发器-做的最好的是make.com。数环通和集简云在这方面差了很多&#xff0c;我考虑主要原因应该是国内没有用邮件的习惯&#xff0c;都是微信来微信去。 2024年1月25日的观察结果 集简云 有邮件触发器&#xff0c;但是它获取的邮件信息很少。 我最关心…

深入解析MySQL数据库锁机制

目录 引言 一、锁的基本概念 1. 共享锁和排它锁 2. 行锁和表锁 二、MySQL锁的类型 1. 共享锁&#xff08;Shared Lock&#xff09; 2. 排它锁&#xff08;Exclusive Lock&#xff09; 3. 意向共享锁&#xff08;Intention Shared Lock&#xff09; 4. 意向排它锁&…

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 map LeetCode1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;…

Qt防止创建窗口抢焦点

问题是&#xff0c;当我在 Qt 中打开一个新窗口时&#xff0c;它会自动窃取前一个应用程序的焦点。 有什么办法可以防止这种情况发生吗&#xff1f; setAttribute(Qt::WA_ShowWithoutActivating);这会强制窗口不激活。即使有Qt::WindowStaysOnTopHint flag 出处&#xff1a; S…

什么是超融合?

文章标题 前言一、超融合是什么&#xff1f;二、超融合原理2.1、超融合三大组件2.2、超融合和传统架构对比2.3、传统方案和超融合软件架构与资源管理模式对比 三、 超融合与SDS、分布式存储关系3.1、SDS是什么 &#xff1f;3.2、分布式存储是什么&#xff1f;3.3、超融合是什么…

<网络安全>《6 脆弱性扫描与管理系统》

1 概念 脆弱性扫描与管理系统本质上就是系统漏洞扫描&#xff0c;简称漏扫。 根据漏洞规则库&#xff08;本地漏洞库、ActiveX库、网页木马库、网站代码审计规则库等&#xff09;为基础&#xff0c;采用深度主机服务探测、Web智能化爬虫、SQL注入状态检测、主机配置检查以及弱…

开始学习Vue(路由)

一、什么是路由 SPA 指的是一个 web 网站只有唯一的一个 HTML 页面&#xff0c;所有组 件的展示与切换都在这唯一的一个页面内完成。 此时&#xff0c;不同组件之间的切换需要通过前端路由来实现。 结论&#xff1a;在 SPA 项目中&#xff0c;不同功能之间的切换&#xff0…

vue el-date-picker 开始日期不能大于结束日期

HTML <el-form-item label"开始日期" prop"startTime"><el-date-picker clearable v-model"form.startTime" type"date" value-format"yyyy-MM-dd" :picker-options"pickerOptionsStartq" placeholder&q…

CAN总线接头(接线端子)都有哪些种类。

CAN总线是广泛应用在汽车控制和工业自动化控制领域里的现场总线&#xff0c;具有广阔的发展前景。基于CAN总线&#xff0c;工程师们开发出了各种各样的相关设备&#xff0c;比如USBCAN分析仪以及CAN转换网关等等。不知道你是否注意过&#xff0c;这些CAN总线设备的CAN接口都是什…

CUBEMX与FreeRTOS在Arm Compiler 6下的配置方法

在嵌入式开发中&#xff0c;STM32是一种广泛使用的微控制器。为了提高开发效率&#xff0c;我们通常会利用ST公司提供的STM32CubeMX工具来配置硬件&#xff0c;并结合FreeRTOS这一实时操作系统来进行多任务处理。本文将深入探讨如何在这一框架下&#xff0c;使用Arm Compiler 6…

结合Tensuns管理prometheus的blackbox与告警设置

场景说明&#xff1a; 因为业务服务器已经完成了三级等保&#xff0c;禁止在业务服务器上部署任何应用&#xff0c;遂选择一台新的服务器部署prometheus&#xff0c;采用blackbox_exporter监控业务服务器的端口与域名状态。 Tensuns项目介绍 https://github.com/starsliao/T…

链表--24. 两两交换链表中的节点/medium 理解度C

24. 两两交换链表中的节点 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&…

forEach()方法跳出循环

forEach方法如何跳出循环_foreach跳出循环-CSDN博客 forEach方法遍历数组&#xff0c;每次遍历都根据条件判断&#xff0c;当条件符合时&#xff0c;就跳出整个遍历&#xff0c;不再继续遍历后面的元素 forEach()方法跳出整个循环遍历 forEach方法一般用抛出异常的方式跳出整…

Python学习之路-Flask项目:博客前台

Python学习之路-Flask项目:博客前台 前言 前一篇完成了项目开发前的所有准备工作&#xff0c;本篇将完成整个博客的前台相关工作。 首页 前言 首页主要为我们提供各个分类入口已经按时间顺序的文章列表和列表排行等数据&#xff0c;是进入博客中第一眼看到的&#xff0c;接…

【JAVA语言-第15话】集合框架(二)——List、ArrayList、LinkedList、Vector集合

目录 List集合 1.1 概述 1.2 特点 1.3 常用方法 1.4 ArrayList集合 1.4.1 概述 1.4.2 练习 1.5 LinkedList集合 1.5.1 概述 1.5.2 特点 1.5.3 常用方法 1.5.4 练习 1.6 Vector类 1.6.1 概述 1.6.2 练习 1.7 List实现类的异同点 List集合 1.1 概述 java.util…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第三天-Bootloader编写(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1KE2cq_kHaRW5HsP29hgL6w?pwd1688 提取码&#xff1a;1688 链接脚本 0. Contents 1. 概论 2. 基本概念 3. 脚本格式 4. 简单例子 5. 简单脚本命令 6. 对符号的赋值 7. SECTIONS命令 8. MEMORY命令 9. PHDRS命令 10. VERS…

函数式接口

文章目录 函数式接口函数式接口当做方法的参数函数式接口作为返回值生产者接口 - Supplier消费者接口 - Consumer使用方式&#xff1a;案例&#xff1a;字符串拆分 判断接口 - Predicate使用方式应用场景 加工接口 - Function 函数式接口 只有一个抽象方法的接口&#xff0c;转…