【启程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个预定义标识符,包含基础数据类型和系统内嵌函数:

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

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

相关文章

【JVM】内存区域划分 | 类加载的过程 | 双亲委派机制 | 垃圾回收机制

文章目录 JVM一、内存区域划分1.方法区(1.7之前)/ 元数据区(1.8开始)2.堆3.栈4.程序计数器常见面试题: 二、类加载的过程1.类加载的基本流程1.加载2.验证3.准备4.解析5.初始化 2.双亲委派模型类加载器找.class文件的过…

[JDK工具-5] jinfo jvm配置信息工具

文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…

WordPress安装memcached提升网站速度

本教程使用环境为宝塔 第一步、服务器端安装memcached扩展 在网站使用的php上安装memcached扩展 第二步:在 WordPress 网站后台中,安装插件「Memcached Is Your Friend」 安装完成后启用该插件,在左侧工具-中点击Memcached 查看是否提示“U…

Leetcode - 398周赛

目录 一,3151. 特殊数组 I 二,3152. 特殊数组 II 三,3153. 所有数对中数位不同之和 四,3154. 到达第 K 级台阶的方案数 一,3151. 特殊数组 I 本题就是判断一个数组是否是奇偶相间的,如果是,…

Linux下的调试器 : gdb指令详解

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 gdb是什么 gdn是linu…

开源大模型与闭源大模型,你更看好哪一方?

开源大模型与闭源大模型,你更看好哪一方? 简介:评价一个AI模型“好不好”“有没有发展”,首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径,你更看好哪一种呢? 1.方向一:数据隐私 …

英伟达的GPU(3)

上节内容:英伟达的GPU(2) (qq.com) 书接上文,上文我们讲到CUDA编程体系和硬件的关系,也留了一个小问题CUDA core以外的矩阵计算能力是咋提供的 本节介绍一下Tensor Core 上节我们介绍了CUDA core,或者一般NPU,CPU执行…

pyqt QMainWindow菜单栏

pyqt QMainWindow菜单栏 pyqt QMainWindow菜单栏效果代码 pyqt QMainWindow菜单栏 QMainWindow 是 PyQt中的一个核心类,它提供了一个主应用程序窗口,通常包含菜单栏、工具栏、状态栏、中心窗口(通常是一个 QWidget 或其子类)等。…

【数据结构/C语言】深入理解 双向链表

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:数据结构与算法 在阅读本篇文章之前,您可能需要用到这篇关于单链表详细介绍的文章 【数据结构/C语言】深入理解 单链表…

[vue error] vue3中使用同名简写报错 ‘v-bind‘ directives require an attribute value

错误详情 错误信息 ‘v-bind’ directives require an attribute value.eslintvue/valid-v-bind 错误原因 默认情况下,ESLint 将同名缩写视为错误。此外,Volar 扩展可能需要更新以支持 Vue 3.4 中的新语法。 解决方案 更新 Volar 扩展 安装或更新 …

java人口老龄化社区服务与管理平台源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的人口老龄化社区服务与管理平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 人口老龄化…

Elasticsearch的Index sorting 索引预排序会导致索引数据的移动吗?

索引预排序可以确保索引数据按照指定字段的指定顺序进行存储,这样在查询的时候,如果固定使用这个字段进行排序就可以加快查询效率。 我们知道数据写入的过程中,如果需要确保数据有序,可能需要在原数据的基础上插入新的数据&#…

vue实现页面渲染时候执行某需求

1. 前言 在之前的项目中,需要实现一个监控token是否过期从而动态刷新token的功能,然而在登录成功后创建的监控器会在浏览器刷新点击或者是通过导航栏输入网址时销毁... 2. 试错 前前后后始过很多方法,在这里就记录一下也许也能为各位读者排…

【每日力扣】84. 柱状图中最大的矩形 与 295. 数据流的中位数

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为…

redis6.2.7 搭建一主多从

1、集群规划 节点端口角色192.168.137.1026379master192.168.137.1026380slave192.168.137.1036381slave 2、伪集群搭建 2.1 创建fake_cluster 目录存放 公共配置文件 # 进入redis目录 cd /app/apps/redis-6.2.7# 创建存放伪集群的目录 mkdir fake_cluster#复制redis.conf到…

DTC 2024回顾丨云和恩墨重塑数据库内核技术,革新企业降本增效之道

在数字化浪潮席卷全球的当下,关系型数据库作为市场主导力量的地位依然稳固。然而,面对新兴数据库与服务形态的挑战,以及企业日益强烈的降本增效需求,数据库技术的发展必须紧跟时代步伐,充分发挥资源效能以提升企业竞争…

【机器学习300问】99、多通道卷积神经网络在卷积操作时有哪些注意事项?

一、多通道卷积神经网络示例 还是以图像处理为例,如果你的目标不仅是分析灰度图像特性,还打算捕捉RGB彩色图像的特征。如下图,当面对一张66像素的彩色图像时,提及的“3”实际上是指红、绿、蓝三种颜色通道,形象地说&am…

书生·浦语第二期-笔记2

课程链接:https://github.com/InternLM/Tutorial/tree/camp2 视频地址:轻松玩转书生浦语大模型趣味Demo_哔哩哔哩_bilibili 大模型及InternLM介绍 大模型:人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型 特点&#xff1a…

【Linux杂货铺】进程通信

目录 🌈 前言🌈 📁 通信概念 📁 通信发展阶段 📁 通信方式 📁 管道(匿名管道) 📂 接口 ​编辑📂 使用fork来共享通道 📂 管道读写规则 &…