go破冰之旅·5·常量、变量、数据类型

news2024/9/23 13:26:55

成体系的、快速学通Go,就在此时,持续连载!

上一篇:

https://lan6193.blog.csdn.net/article/details/123454411icon-default.png?t=N3I4https://lan6193.blog.csdn.net/article/details/123454411上文熟悉了Go的基础符号、基础规则,本文我们来重点说说常量、变量、数据类型这些基础元素,为快速写出自己的程序打好各项玩法基础! 

目录

数据类型

常量

变量


数据类型

在常见的各种声明中,少不了定义“它”是什么类型的,比如一个变量/常量的类型、一个函数的反正类型等。数据类型的出现正是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。现在一起看看所有的数据类型:

类型名称关键字默认值可选值/备注
布尔boolfalsetrue、false
字符串string空字符串(长度为0),go中字符串使用 UTF-8 编码
float32浮点类型float320
float64浮点类型float640
32 位实数和虚数complex64
32 位实数和虚数complex64
无符号整型uint0在64位机器上等价于uint64,可选uint32、uint64
无符号8位整型uint80范围:0至2^8-1
无符号16位整型uint160范围:0至2^16-1
无符号32位整型uint320范围:0至2^32-1
无符号64位整型uint640范围:0至2^64-1
有符号整型int0在64位机器上等价于uint64
有符号8位整型int80范围:2^-7至2^7-1
有符号16位整型int160范围:2^-15至2^15-1
有符号32位整型int320范围:2^-31至2^31-1
有符号64位整型int640范围:2^-63至2^63-1
字节类型byte类似uint8
rune类型rune类似 int32
无符号整型uintptr

用于存放指针 

其它类型:

函数类型、数组类型、切片类型、指针类型、结构体struct类型、channel、map(k-v映射,其它语言中的字典)、接口类型(interface)

这里仅作介绍,有个初始印象,一些较复杂类型我们后面需要抽出大量篇幅来专门说明和分析。

常量

所谓常量,就是在程序运行中不会被修改的量。常量的类型可以是字符串型、布尔型、数字型(整数型、浮点型和复数)。

来看看常量的声明及应用

import (
	"fmt"
	"reflect"
)

// 显式的定义,带类型
const d0 string = "name0"

// 隐式的定义,不带类型(编译器会根据值来推断类型)
const d1 = "name1"
const d2 = 19.9
const d3 = false

// 定义多个同类型常量,可用如下方式简写
const d4, d5 = 1, 2
// 注意,上述const定义还可以合在一起通过const ()的方式一起定义

func main() {
	fmt.Println(d0 + d1)            // +相当于两个字符串的拼接
	fmt.Println(reflect.TypeOf(d2)) // 没有带类型,那我们看看它默认被声明为了什么类型?
	fmt.Println(d3)
	fmt.Println(d4 + d2)  // 运算+
	fmt.Println(d4 - d5)  // 运算-
	/*
		name0name1
		float64
		false
		20.9
		-1
	*/

// d5 = 1  // 可以看到Cannot assign to d5,常量是不能被修改的,否则就不是常量了
}

特殊的常量符号-iota

1,iota是和const一起出现的常量符号,经过它定义的常量是可以被编译器修改的;

2,iota在const关键字出现时会被重置为0(const下第一行之前),const中每新增一行常量声明将使iota计数一次;

3,iota可以用来做常见的枚举。

来通过实例看看它是怎么回事:

const (
	a1  = iota     // 初始为0
	a2  = iota     // 自动+1
	a3  = iota     // 自动+1
	a4             // 在新的一行iota再次被使用,它的值都会自动+1,a3=2,因此a4=3
	a5  = 9.9      // 被设置为9.9,与iota无关,但此行iota计数实际为4
	a6             // 依旧是9.9,此行iota计数为5
	a7  = true     // 被设置为true,即布尔类型,虽与iota无关,但此行iota计数实际为6
	a8             // true, 此行iota计数实际为7
	a9  = iota     // 重新设置为iota,则此时为8
	a10            // 继续iota,会+1,因此值为9
	a11 = 1 + iota // 继续iota,值本应该为10,但赋值时给iota做了+1操作,因此值=11
)

const (
	b1 = iota + 1 // 初始为0,但做了+1操作,值为1
	b2 = iota + 1 // 本应为1,但做了+1操作,值为2
	b3            // 本应为2,但做了+1操作(格式与上一行一致),因此值为3
	b4 = iota     // 本应为3,直接设置为iota,相当于按原有iota计数,因此值为3
	b5 = iota + 1 // 本应为4,但做了+1操作,因此值为5
	b6 = "b6"     // 设置为字符串,则值为字符串b6(注意此行iota本应是5)
	b7 = iota + 1 // 本应为6,但做了+1操作,因此值为7
)


// <<是移位运算,代表左移
const (
	c1 = iota           // c1=0
	c2 = 1 << iota      // iota值为1,c2值等于将0001左移1位,等价于c2 = 1 << 1,即0010=2
	c3 = iota << iota   // iota值为2,等价于c3 = 2 << 2,即0010 --> 1000=8
	c4 = 3 << iota      // iota值为3,等价于c4 = 3 << 3,即00000011 --> 00011000=24
	c5 = c3 + c4 + iota // 相当于c5 = 8 + 24 + 4 = 36
)

func main() {
	/*
		   	因为iota会自动+1,因此上述前三行定义又等价于:
		   	const (
		      	a1 = iota
		      	a2
		      	a3
		      )
		其中b3就相当于 b3 = iota + 1
	*/
	fmt.Println(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
	fmt.Println(b1, b2, b3, b4, b5, b6, b7)
	fmt.Println(c1, c2, c3, c4, c5)
}

speed running:

0 1 2 3 9.9 9.9 true true 8 9 11
1 2 3 3 5 b6 7
0 2 8 24 36

代码中做了详细解释,相信你现在对iota已有了新的认识哦!

变量

变量也很简单,使用var来声明,格式与常量几乎没什么区别:

import (
	"fmt"
	"reflect"
)

var (
	e1 = "d1"
	e2 = 2
	e3 = false
	e4 = 9.9
	e5 = 2 * e4
)

func main() {
	fmt.Println(e1, e2, e3, e4, e5) // d1 2 false 9.9 19.8

	// 修改变量
	e2 = 2 * e2
	fmt.Println(e2) // 4

	// 仅声明,不赋值,则变量为默认类型的零值(零值意为该类型的初始值,如整型是0,字符串就是空字符串,布尔就是false等等)
	var e6 int
	var e7 bool
	fmt.Println(e6, e7) // 0 false

	// 还可以同时声明+赋值,符号为:=
	e8 := 9.9                           // 直接定义变量e8并赋值9.9,并未指定类型,编译器自动设定为float64
	fmt.Println(e8, reflect.TypeOf(e8)) // 9.9 float64

	// 可同时定义多个变量
	var e9, e10, e11 = 1, 2, 3
	fmt.Println(e9, e10, e11) // 1 2 3
}

经过上文总结和示例,关于常量、变量、数据类型相信你已经有了一个全面的认识,一些运算符也悄然蕴含到了其中,下一篇我们专门来汇总一下各种运算符及其用法。

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

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

相关文章

前端项目代码规范

一、变量与函数的命名&#xff08;变量名和函数名是最好的注释&#xff09; 通常情况下函数小陀峰、类名大陀峰、变量短横线/小陀峰、const全大写单词要表达出正确的语义&#xff0c;如&#xff1a;array类型或其它集合类型用英语复数格式、其它类型不要用复数格式区分函数为功…

async/await 在 C# 语言中是如何工作的?(下)

接《async/await 在 C# 语言中是如何工作的&#xff1f;&#xff08;上&#xff09;》、《async/await 在 C# 语言中是如何工作的&#xff1f;&#xff08;中&#xff09;》&#xff0c;今天我们继续介绍 SynchronizationContext 和 ConfigureAwait。 ▌SynchronizationContext…

【SVN已解决】修改svn服务端地址为ip或者域名地址的方法

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

Vue之指令详解与自定义指令

指令 想要了解自定义指令&#xff0c;那肯定得先明白什么是指令。 指令的本质&#xff1a;语法糖&#xff0c;标志位。在编译阶段 render 函数里&#xff0c;会把指令编译成 JavaScript 代码。 常见的Vue内置指令有&#xff1a; v-on 即 。v-on:click”function“&#xff…

Node【Express框架【二】】

文章目录 &#x1f31f;前言&#x1f31f;中间件&#x1f31f;中间件函数&#x1f31f;什么是中间件函数&#x1f31f;中间件函数可以做什么 &#x1f31f;Express中间件的类型&#x1f31f;应用级中间件&#x1f31f;路由器级中间件&#x1f31f;错误处理中间件&#x1f31f;内…

人为惨案之kube-controller-manager 不断重启根因溯源

文章目录 背景问题发现排查CSI provision排查kube-controller-manager查看controller log紧急恢复求助chatgpt 背景 2023年4月21日10:38:07&#xff0c;在集群中测试RBAC的时候&#xff0c;在kuboard的界面神出鬼没的删除了几个clusterRole。练习一个CKA的练习题目. Create a…

如何实现计算机上的文件共享

文件共享 第一步&#xff1a;设置无线热点第二步&#xff1a;设置本地用户权限第三步&#xff1a;设置共享文件夹第四步&#xff1a;打开自己的移动热点&#xff0c;并且让对方连接自己的热点第五步&#xff1a;让对方的电脑进行连接自己共享的文件 第一步&#xff1a;设置无线…

React-Redux详解

React-Redux详解 前言 React-Redux是一个用于在React应用中管理状态的第三方库。它是基于Redux架构的&#xff0c;提供了一种在React应用中高效管理状态的方式。React-Redux通过将Redux的核心概念和React组件相结合&#xff0c;使得在React应用中使用Redux变得更加简单和方便。…

从WebGL到Babylonjs

从WebGL到Babylonjs 一、关于WebGL 前世今生 OpenGL > OpenGL ES > WebGL本质&#xff1a;通过js代码去调用OpenGL的一系列Api 二、WebGL程序的构成 1、一个简单的webgl程序 const canvas document.querySelector(canvas); const gl canvas.getContext(webgl2); c…

llama.cpp一种在本地CPU上部署的量化模型(超低配推理llama)

0x00 背景 前不久&#xff0c;Meta前脚发布完开源大语言模型LLaMA&#xff0c; 随后就被网友“泄漏”&#xff0c;直接放了一个磁力链接下载链接。 然而那些手头没有顶级显卡的朋友们&#xff0c;就只能看看而已了 但是 Georgi Gerganov 开源了一个项目llama.cpp ggergano…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master&#xff0c;一旦master出现故障&#xff0c;将导致整个集群无法使用&#xff0c;所以在实际的生产环境中&#xff0c;需要搭建HBase的高可用&#xff0c;也就是让HMaster高可用&#xff0c;也就是需要再选择一个或多个节点也…

【C语言】那些 “虾仁猪心“ 的坑题

本章介绍 最近翻笔记&#xff0c;整理了下那些日子里面掉过的坑题&#xff0c;说多都是泪&#xff01;&#xff01;也许是自己的储备知识不足&#xff0c;才造成的大坑&#xff0c;今天把题拿出来给大家溜溜&#xff0c;看大家做时候有没有踩坑&#xff01; 文章目录 1:第一题2…

项目笔记-瑞吉外卖

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能&#xff1a;star4.1代码实现 5.退出功能6.页面效果出现 1.业务开发 day01 1.软件开发整体介绍 2.项目整体介绍⭐️ 后端&#xff1a;管理菜品和员工信息前台&#xff1a;通过手机端…

根据cadence设计图学习硬件知识 day03 了解 一些芯片 和 数据手册下载的地方

1. MT53D512M32D2DS 芯片&#xff08;动态随机存取存储器&#xff09;的技术指标 1.1 16n Prefetch (预加载) (n --芯片位宽) DDR 体系 链接&#xff1a;DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr prefetch_qq_25814297-npl的博客-CSDN博客 1.2 每个通…

网络层重点协议之【IP协议】

0. IP地址组成 IP地址分为两个部分&#xff0c;网络号和主机号 网络号&#xff1a;标识网段&#xff0c;保证相互连接的两个网段具有不同的标识主机号&#xff1a;标识主机&#xff0c;同一网段内&#xff0c;主机之间具有相同的网络号&#xff0c;但是必须有不同的主机号 一…

浅谈: 计算机—JVM—线程

计算机存储模型(CPU、寄存器、高速缓存、内存、外存) 现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM)&#xff0c;普通内存一般是DRAM&#xff0c;这种读写速度更快的介质充当CPU和内存之间的Cache&#xff0c;这就是缓存。当CPU…

医学图像分割之TransUNet

目录 一、背景 二、提出问题 三、解决问题 四、网络结构详解 CNN部分&#xff08;ResNet50的前三层&#xff09; transformer部分 U-Net的decoder部分 五、模型性能 开头处先说明下TransUNet的地位&#xff1a;它是第一个将transformer用于U型结构的网络。 一、背景 医…

【Java|golang】1105. 填充书架---动态规划

给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上&#xff08;它们的厚度之和小于等于书架的宽度 shelfWidt…

PCL点云库(1) — 简介与数据类型

目录 1.1 简介 1.2 PCL安装 1.2.1 安装方法 1.2.2 测试程序 1.3 PCL数据类型 1.4 PCL中自定义point类型 1.4.1 增加自定义point的步骤 1.4.2 完整代码 1.1 简介 来源&#xff1a;PCL&#xff08;点云库&#xff09;_百度百科 PCL&#xff08;Point Cloud Library&…

Vue组件间通信的7种方法(全)

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进…