当前位置: 首页 > news >正文

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。

目录

变量的概念

数据类型的概念

数据类型转换

基本数据类型指针

标识符的概念


变量的概念

一个程序就是一个世界,不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,相当于内存中一个数据存储空间的表示,以下是go定义变量并使用的基本方式:

package main
import "fmt"
func main() {// 1.声明变量var age int// 2.变量赋值age = 18// 3.使用变量fmt.Println("age = ", age)// 声明和赋值可以合并成一句var age2 int = 20fmt.Println("age2 = ", age2)
}

上面这种显然易见,控制台打印 age=18 和 age2 = 20,接下来总结一下变量的使用方式:

package main
import "fmt"
func main() {// 第一种方式,指定变量的类型并赋值var num int = 18fmt.Println(num)// 第二种方式,指定变量的类型,但是不赋值,使用默认值var num2 intfmt.Println(num2)// 第三种方式,如果没有写变量的类型,会根据等号后面的值进行判断变量的类型(自动判断)var num3 = "tom"fmt.Println(num3)// 第四种方式:省略var,注意 := 不能写为 =sex := "男"fmt.Println(sex)
}

最终控制台打印的效果如下所示:

声明在函数内部的是局部变量,如果想声明全局变量可以将变量写在函数外面,如下:

package main
import "fmt"
// 单个全局变量
var n = 100
var m = 10.0
// 一次性声明全局变量
var (n1 = 12n2 = 15
)
func main() {fmt.Println(n, m, n1, n2) // 100 10 12 15
}

数据类型的概念

数据类型是编程中用来区分数据存储方式、操作方式以及数据的范围和限制的一种分类方式。它定义了数据的种类以及对这些种类数据进行的操作,如下图所示展示golang的数据类型的分类:

上述数据类型中字符类型有特殊的转义字符,这里简单的讲解一下:

转义符含义Unicode值
\b退格(backspace)\u0008
\n换行\u000a
\r回车\u000d
\t制表符(tab)\u0009
\"双引号\u0022
\'单引号\u0027
\\反斜杠\u005c

接下来对这些转义字符进行一个简单的测试:

package main
import "fmt"
func main() {// 转义字符// \n 换行fmt.Println("aaa\nbbb")// \b 退格fmt.Println("aaa\bbbb")// \r 光标回到本行的开头,后续输入会替换原有字符fmt.Println("aaa\rbbb")// \t 制表符 以8个距离为单位fmt.Println("aaa\tbbb")fmt.Println("aaaaa\tbbb")// \"fmt.Println("\"aaa\"")// \v 垂直制表符fmt.Println("aaa\vbbb")// \f 换页符fmt.Println("aaa\fbbb")// \a 响铃fmt.Println("aaa\abbb")// \000 空字符fmt.Println("aaa\000bbb")// \xhh 十六进制fmt.Println("aaa\x01bbb")// \uhhhh 十六进制fmt.Println("aaa\u01bbb")
}

上面代码执行,最终达到的效果如下:

数据类型转换

go在不同类型的变量之间赋值时需要显式转换,并且只有显式转换(强制转换),代码如下:

package main
import "fmt"
func main() {// 进行类型转换var n1 int = 100//var n2 float32 = n1 在这里自动转换不好使,比如显式转换fmt.Println(n1) // 100var n2 float32 = float32(n1)fmt.Println(n2) // 100// 注意:n1的类型其实还是int类型,只是将n1的值100转为float32类型,n1还是int类型fmt.Printf("%T", n1) // intfmt.Println()// 将int64类型转为int8的时候,编译不会出错,但是会数据溢出var n3 int64 = 888888var n4 int8 = int8(n3)fmt.Println(n4) // 56var n5 int32 = 12var n6 int64 = int64(n5) + 30 // 一定要匹配 = 左右的数据类型fmt.Println(n5)               // 12fmt.Println(n6)               // 42var n7 int64 = 12var n8 int8 = int8(n7) + 127 //编译通过但是结果可能会溢出//var n9 int8 = int8(n7) + 128 //编译不会通过fmt.Println(n8) // -117//fmt.Println(n9) // -128
}

基本数据类型转换为string: 在程序开发中,我们经常需要用到基本数据类型转换成string类型,或者将string类型转换成基本数据类型,接下来我们开始讲解两者之间的转换方式,这里我们先介绍一下整数常用的代替字符:

接下来我们通过 fmt.Sprintf("%参数", 表达式) 的方式进行字符串的转换,代码如下:

package main
import "fmt"
func main() {var n1 int = 10var n2 float32 = 4.78var n3 bool = falsevar n4 byte = 'a'var s1 string = fmt.Sprintf("%d", n1)fmt.Printf("s1对应的类型是:%T,s1 = %q \n", s1, s1)var s2 string = fmt.Sprintf("%f", n2)fmt.Printf("s2对应的类型是:%T,s2 = %q \n", s2, s2)var s3 string = fmt.Sprintf("%t", n3)fmt.Printf("s3对应的类型是:%T,s3 = %q \n", s3, s3)var s4 string = fmt.Sprintf("%c", n4)fmt.Printf("s4对应的类型是:%T,s4 = %q \n", s4, s4)
}

最终达到的效果如下:

接下来我们通过 strconv包的函数的方式进行字符串的转换,代码如下:

package main
import ("fmt""strconv"
)
func main() {var n1 int = 18// 第一个参数必须转为int64类型,第二个参数指定字面值的进制形式为十进制var s1 string = strconv.FormatInt(int64(n1), 10)fmt.Printf("s1对应的类型是:%T,s1 = %q \n", s1, s1)var n2 float64 = 4.79// 第二个参数:'f' (-ddd.ddd) 第三个参数:9 保留小数点后面9位 第四个参数:表示这个小数是float64类型var s2 string = strconv.FormatFloat(n2, 'f', 9, 64)fmt.Printf("s2对应的类型是:%T,s2 = %q \n", s2, s2)var n3 bool = truevar s3 string = strconv.FormatBool(n3)fmt.Printf("s3对应的类型是:%T,s3 = %q \n", s3, s3)
}

最终达到的效果如下:

string转基本数据类型:接下来我们开始学习如何将上面讲解的类型转换互换过来,如下:

package main
import ("fmt""strconv"
)
func main() {// string --> boolvar s1 string = "true"var b bool/*ParseBool这个函数的返回值有两个:(value bool, err error)value就是我们得到的布尔类型的数据,err出现的错误我们只关注得到的布尔类型的数据,err可以用 _ 直接忽略*/b, _ = strconv.ParseBool(s1)fmt.Printf("b的类型是:%T, b = %v \n", b, b)// string --> int64var s2 string = "20"var num1 int64num1, _ = strconv.ParseInt(s2, 10, 64)fmt.Printf("num1的类型是:%T, num1 = %v \n", num1, num1)// string --> float32/float64var s3 string = "3.14"var f1 float64f1, _ = strconv.ParseFloat(s3, 64)fmt.Printf("f1的类型是:%T, f1 = %v", f1, f1)
}

最终达到的效果如下:

注意:string向基本数据类型转换的时候,一定要确保string类型能够转成有效的数据类型,否则最后得到的结果就是按照对应的类型的默认值输出:

package main
import ("fmt""strconv"
)
func main() {// string --> boolvar s1 string = "golang"var b boolb, _ = strconv.ParseBool(s1)fmt.Printf("b的类型是:%T, b = %v \n", b, b)// string --> int64var s2 string = "golang"var num1 int64num1, _ = strconv.ParseInt(s2, 10, 64)fmt.Printf("num1的类型是:%T, num1 = %v \n", num1, num1)
}

最终达到的效果如下:

基本数据类型指针

在Go语言中,指针是一个表示内存地址的值。它指向存储在内存中的变量或者数据结构的位置。

通过指针,我们可以在函数之间共享数据,以及在函数内部修改外部变量的值。在Go语言中,我们使用"&"符号来获取变量的内存地址,使用"*"符号来访问指针所指向的变量的值。

package main
import "fmt"
func main() {var age int = 18// &符号 + 变量 就可以获取这个变量的内存的地址fmt.Println(&age) //0xc00001a088/*ptr 指针变量的名字ptr 对应的类型是:*int 是一个指针类型(可以理解位 指向int类型的指针)&age 就是一个地址,是ptr变量的具体的值*/var ptr *int = &agefmt.Println(ptr)fmt.Println("ptr本身这个存储空间的地址为:", &ptr)// 想获取ptr这个指针或者这个地址指向的那个数据fmt.Printf("ptr指向的数据值为:%v", *ptr) // ptr指向的数值为:18
}

总结:指针中最重要的两个符号是:& 取内存地址;* 根据地址取值;当然指针还可以进行如下的操作:

通过指针改变指向值:代码如下:

package main
import "fmt"
func main() {var num int = 10fmt.Println(num) // 10// 注意,指针接收的一定是地址值,所以要对num进行取地址&num,如果直接赋值num则会报错var ptr *int = &num *ptr = 20fmt.Println(num) // 20
}

标识符的概念

在Go语言中,标识符(identifier)就是指程序员自己定义的变量、常量、函数、类型等命名实体的名称。标识符可以包含字母、数字和下划线(_),但是必须以字母或下划线开头,不能以数字开头。

在Go语言中,是可以使用汉字作为变量名的,但是并不推荐这样做。虽然Go语言支持Unicode字符作为标识符的一部分,包括汉字,但是通常不建议在代码中使用非ASCII字符作为标识符,包括汉字。虽然Go语言允许使用汉字作为变量名,但是出于代码可读性、可维护性以及跨平台兼容性考虑,建议仍然使用英文单词或者符合ASCII字符集的命名方式。如下演示一下:

package main
import "fmt"
func main() {var 年龄 int = 10fmt.Println(年龄) // 10
}

起名规则

1)包名:尽量保持package的名字和目录保持一致,采取有意义的包名,简短,有意义,不要和标准库冲突。举例:main包是一个程序的入口包,所以main函数它所在的包建议定义为main包,如果不定义为main包,那么就不能得到可执行文件。

2)变量名、函数名、常量名等尽量采用驼峰命名法。

3)如果变量名、函数名、常量名首字母大写,则可以被其他的包访问,如果首字母小写,则只能在本包中使用(利用首字母大写小写完成权限控制)

注意:如果导包失败需要在文件夹里运行下面的命令生成mod文件 go mod init (study)根路径名称

控制打印如下的效果,可以看到我们导包之后,是拿到了对应的数值的:

在go语言中关键字就是程序发明者规定的有特殊含义的单词,又叫保留字,go语言中一共有25个关键字,如下:

一共有36个预定义标识符,包含基础数据类型和系统内嵌函数:

相关文章:

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

使用docker部署项目

一、docker私有镜像仓库 1、docker私有镜像仓库 库(Repository)是集中存放镜像的地方,又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候,它实际上是从registry.docker.com这个地址去查找,这就是Docker公…...

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测

目前现状 无法客观、方便地掌握护林员的到位情况,因而无法有效地保证巡护人员按计划要求,按时按周期对所负责的林区开展巡护,使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理,现场状况、位置等信息描述…...

【最优化方法】实验三 无约束最优化方法的MATLAB实现

实验的目的和要求:通过本次实验使学生进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。 实验内容: 1、最速下降法的MATLAB实现 2、牛顿法的MATLAB实现 3、共轭梯度法的MATLAB…...

kafka-偏移量图解

生产者偏移量:生产者发送消息时写入到哪个位置(主题的每个分区会存储一个 leo 即将写入消息的偏移量),每次写完消息 leo 会 1 消费者偏移量:消费者从哪个位置开始消费消息,小于等于 leo,每个组…...

内网安全--隧道技术-MSF上线本地

免责声明:本文仅做技术交流与学习... 不得不说,小白最近也是用上了viper,这里要特别感谢一下my bro 北岭敲键盘的荒漠猫 MSF--viper: --生成马子-->上线 --进入meterpreter. 1-查看路由,添加路由. 查看路由信息 : run autoroute -p run post/multi/manage/autoroute 添加…...

初识STM32单片机-TIM定时器

初识STM32单片机-TIM定时器 一、定时器概述二、定时器类型2.1 基本定时器(TIM6和TIM7)2.2 通用定时器(TIM2、TIM3、TIM4和TIM5)2.3 高级定时器(TIM1和TIM8) 三、定时中断基本结构和时基单元工作时序3.1 定时器基本结构3.2 预分频器时序3.3 计数器时序3.3.1 计数器有无预装时序(…...

NSSCTF-Web题目3

目录 [BJDCTF 2020]easy_md5 1、知识点 2、题目 3、思路 [ZJCTF 2019]NiZhuanSiWei 1、知识点 2、题目 3、思路 第一层 第二层 第三层 [BJDCTF 2020]easy_md5 1、知识点 弱比较,强比较、数组绕过、MD5加密 2、题目 3、思路 1、首先我们跟着题目输入&a…...

基于Java实现震中附近风景区预警可视化分析实践

目录 前言 一、空间数据说明 1、表结构信息展示 2、空间范围查询 二、Java后台开发实现 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、百公里风景区列表展示 3、风景区列表展示 4、附近风景区展示 四、总结 前言 地震这类…...

【CTF Web】CTFShow web7 Writeup(SQL注入+PHP+进制转换)

web7 1 阿呆得到最高指示&#xff0c;如果还出问题&#xff0c;就卷铺盖滚蛋&#xff0c;阿呆心在流血。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\…...

ABAP WRITE换行输出

不换行&#xff1a; write hello world!. write 春天马上就到了!. 换行&#xff1a; write hello world!. write /春天马上就到了!. 换行的第二种&#xff1a; write: hello world! ,/,春天马上就到了!....

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地&#xff0c; 我刚开始用的nodejs14报错&#xff0c; 后面换成nodejs16&#xff0c;启动前端成功了。 页面如下图所示...

python-数据可视化(总)

python-数据可视化 ** 数据可视化 指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…...

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 Enter…...

iPhone win10更改备份路径

1 删掉或改名 旧的Backup, 否则不能连接 ren "C:\Users\Administrator\Apple\MobileSync\Backup" Backup_old 2 在目标盘中 创建新的文件夹 手动创建 MobileSync\Backup 3 链接两个文件夹 mklink /J "C:\Users\Administrator\Apple\MobileSync\Backup" &qu…...

Jmeter元件及基本作用域

&#x1f680;从今天开始学习性能测试工具——Jmeter&#xff0c;小梦也是先学习了下Jmeter的元件概念以及其基本的作用域&#xff0c;整理了下笔记&#xff0c;希望不管是从事开发领域还是测试领域的朋友们&#xff0c;我们一起学习下Jmeter工具&#xff0c;提升工作中的技能&…...

GB-T 43696-2024 网络安全技术 零信任参考体系架构

GB-T 43696-2024 网络安全技术 零信任参考体系架构 编写背景 随着网络环境的日益复杂&#xff0c;传统的网络安全策略已经难以满足现代企业的需求。为了应对不断变化的安全威胁&#xff0c;零信任安全模型应运而生。GB-T 43696-2024《网络安全技术 零信任参考体系架构》是中国…...

Java使用apache.poi生成excel插入word中

加油&#xff0c;新时代打工人&#xff01; 工作需求&#xff0c;上个文章我们生成好的word&#xff0c;这次将生成好的excel表格数据&#xff0c;插入word中。需要准备好excle数据&#xff0c;然后插入到word中。 最后个需要&#xff0c;就是把这些生成好的word文档转成pdf进行…...

斯坦福报告解读3:图解有趣的评估基准(上)

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多数媒体及机构…...

C语言---扫雷游戏的实现

1.扫雷游戏的分析和设计 需要创建3个文件夹 test.c----扫雷游戏的测试 game.c----扫雷游戏的实现 game.h----扫雷游戏的实现 雷的信息使用二维数组存放 • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...