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

news2024/11/16 1:30:34

欢迎来到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 = 20
	fmt.Println("age2 = ", age2)
}

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

package main
import "fmt"
func main() {
	// 第一种方式,指定变量的类型并赋值
	var num int = 18
	fmt.Println(num)
	// 第二种方式,指定变量的类型,但是不赋值,使用默认值
	var num2 int
	fmt.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 = 12
	n2 = 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) // 100
	var n2 float32 = float32(n1)
	fmt.Println(n2) // 100
	// 注意:n1的类型其实还是int类型,只是将n1的值100转为float32类型,n1还是int类型
	fmt.Printf("%T", n1) // int
	fmt.Println()

	// 将int64类型转为int8的时候,编译不会出错,但是会数据溢出
	var n3 int64 = 888888
	var n4 int8 = int8(n3)
	fmt.Println(n4) // 56

	var n5 int32 = 12
	var n6 int64 = int64(n5) + 30 // 一定要匹配 = 左右的数据类型
	fmt.Println(n5)               // 12
	fmt.Println(n6)               // 42

	var n7 int64 = 12
	var 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 = 10
	var n2 float32 = 4.78
	var n3 bool = false
	var 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 = true
	var s3 string = strconv.FormatBool(n3)
	fmt.Printf("s3对应的类型是:%T,s3 = %q \n", s3, s3)
}

最终达到的效果如下:

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

package main
import (
	"fmt"
	"strconv"
)
func main() {
	// string --> bool
	var 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 --> int64
	var s2 string = "20"
	var num1 int64
	num1, _ = strconv.ParseInt(s2, 10, 64)
	fmt.Printf("num1的类型是:%T, num1 = %v \n", num1, num1)

	// string --> float32/float64
	var s3 string = "3.14"
	var f1 float64
	f1, _ = strconv.ParseFloat(s3, 64)
	fmt.Printf("f1的类型是:%T, f1 = %v", f1, f1)
}

最终达到的效果如下:

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

package main
import (
	"fmt"
	"strconv"
)
func main() {
	// string --> bool
	var s1 string = "golang"
	var b bool
	b, _ = strconv.ParseBool(s1)
	fmt.Printf("b的类型是:%T, b = %v \n", b, b)

	// string --> int64
	var s2 string = "golang"
	var num1 int64
	num1, _ = 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 = &age
	fmt.Println(ptr)
	fmt.Println("ptr本身这个存储空间的地址为:", &ptr)
	// 想获取ptr这个指针或者这个地址指向的那个数据
	fmt.Printf("ptr指向的数据值为:%v", *ptr) // ptr指向的数值为:18
}

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

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

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

标识符的概念

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

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

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

起名规则

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

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

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

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

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

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

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

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

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

相关文章

嵌入式全栈开发学习笔记---C语言笔试复习大全25(实现学生管理系统)

目录 实现学生管理系统 第一步:结构体声明 第二步:重命名结构体 第三步:限定可以存储的最大学生数目 第四步:定义结构体指针数组和定义一个整型变量存放当前的人数 第五步:设计欢迎界面 第六步:设计…

【设计模式】JAVA Design Patterns——Command(事务模式)

🔍目的 将请求封装为对象,从而使你可以将具有不同请求的客户端参数化,队列或记录请求,并且支持可撤销操作。 🔍解释 真实世界例子 有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小&#xff0…

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky的公众号&…

C++之std::is_trivially_copyable(平凡可复制类型检测)

目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中,平凡类型(Trivial Type)、平凡可复制类型(TrivialCopyable&#x…

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击(XSS)是一种常见的网络攻击手段,它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程,包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…

8.什么是HOOK

程序编译的本质是,首先计算机它只能看得懂机器码也就是只能看得懂数字,机器码学起来很费劲然后就创造了编译器这个东西,编译器它懂机器语言所以它可以跟机器沟通,而我们人可以跟编译器沟通,人跟编译器的语言就是各种各…

GBDT、XGBoost、LightGBM算法详解

文章目录 一、GBDT (Gradient Boosting Decision Tree) 梯度提升决策树1.1 回归树1.2 梯度提升树1.3 Shrinkage1.4 调参1.5 GBDT的适用范围1.6 优缺点 二、XGBoost (eXtreme Gradient Boosting)2.1 损失函数2.2 正则项2.3 打分函数计算2.4 分裂节点2.5 算法过程2.6 参数详解2.7…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好,我是电商糖果 视频号这两年看着抖音卖货的热度越来越高,也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店,就可以在视频号售卖商品。 具体怎么操作呢,需要拍视频&#xf…

leedcode【142】. 环形链表 II——Java解法

Problem: 142. 环形链表 II 思路解题方法复杂度Code性能 思路 1.用快慢指针找到相遇的点(快指针一次走一步,慢指针一次走两步) 2.一个指针从head开始,一个指针从相遇点开始,一次一步,相遇处即为环入口 解题…

Vmware 17安装 CentOS9

前言 1、提前下载好需要的CentOS9镜像,下载地址,这里下载的是x86_64 2、提前安装好vmware 17,下载地址 ,需要登录才能下载 安装 1、创建新的虚拟机 2、在弹出的界面中选择对应的类型,我这里选择自定义,点…

P459 包装类Wrapper

包装类的分类 1)针对八种基本数据类型相应的引用类型——包装类。 2)有了类的特点,就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

【大数据面试题】32 Flink 怎么重复读 Kafka?

一步一个脚印,一天一道面试题 首先,为什么要读过的 Kafka 数据重写读一次呢?什么场景下要怎么做呢? 答:当任务失败,从检查点Checkpoint 开始重启时,检查点的数据是之前的了,就需要…

从 0 开始实现一个网页聊天室 (小型项目)

实现功能 用户注册和登录好友列表展示会话列表展示: 显示当前正在进行哪些会话 (单聊 / 群聊) , 选中好友列表中的某个好友, 会生成对应的会话实时通信, A给B发送消息, B的聊天界面 / 会话界面能立刻显示新的消息 TODO: 添加好友功能用户头像显示传输图片 / 表情包历史消息搜…

CTF之Web_python_block_chain

这种题对于我来说只能看大佬的wp(但是这一题是wp都看不懂,只能表达一下我的理解了) (最后有简单方法,前面一种没看懂没关系) 下面这一部分是首页的有用部分 访问/source_code,得到源码: # -*-…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

AIGC 005-Dreambooth定制化生成,微调文本到图像的扩散模型!

AIGC 005-Dreambooth定制化生成,微调文本到图像的扩散模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamBooth 论文 (DreamBooth: Fine-Tuning Text-to-Image Diffusion Models for Subject-Driven Generation) 提出了一种新颖的技术&#x…

2024GDCPC广东省赛记录

比赛流程体验,依托,开赛几分钟了,选手还卡在门外无法入场,也没给延时,说好的桌上会发三支笔,于是我们就没准备,要了三次笔,终于在一小时后拿到了😅 比赛题目体验&#xf…

近期阅读论文

Exploring Hybrid Active-Passive RIS-Aided MEC Systems: From the Mode-Switching Perspective abstract 移动边缘计算(MEC)被认为是支持延迟敏感和计算密集型服务的有前途的技术。 然而,随机信道衰落特性导致的低卸载率成为制约MEC性能的…

数据结构篇之二叉树(binary tree)的介绍和应用

欢迎光临: 男神 目录 一树的介绍和表示: 二二叉树的介绍及性质: 三堆的介绍及创建: 1堆的创建: 2堆的应用: 四二叉树的创建: ①// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二…