2 变量运算符-基本数据类型讲解【Go语言教程】

news2024/12/25 9:31:29

2 变量运算符-基本数据类型讲解【Go语言教程】

2.1 变量

2.1.1 声明变量方式

  1. 指定变量类型,声明后若不赋值,使用默认值
    在这里插入图片描述
  2. 类型推导
    在这里插入图片描述
  3. 通过:=
    在这里插入图片描述
  4. 多变量声明
    在这里插入图片描述
  5. 全局变量定义

在函数外部定义的就是全局变量

在这里插入图片描述

变量=变量名+值+数据类型

在这里插入图片描述

注意:如果go程序报错:package 'xxx' is not in GOROOT

  • 执行go mod init即可

2.2 基本数据类型

在这里插入图片描述

2.2.1 整数

①int的有符号类型
在这里插入图片描述
②int的无符号类型
在这里插入图片描述
③int的其他类型
在这里插入图片描述

  • 整型的使用细节:
  1. Golang 各整数类型分:有符号和无符号,int uint 的大小和系统有关。
  2. Golang整型默认声明为int
  3. 在程序中查看某个变量的字节大小和数据类型

在这里插入图片描述

package main
import (
	"fmt"
	"unsafe"
)
// var (
// 	address = "北京"
// 	sex int = 1
// )
func main(){
	var n2 uint = 68
	fmt.Printf("n的类型为 %T, n2占用的字节数位 %d ", n2, unsafe.Sizeof(n2))
}

2.2.2 浮点型、小数

在这里插入图片描述

浮点数=符号位+指数位+尾数位说明:浮点数都是有符号的.

  • float64比float32精度更高
package main
import (
	"fmt"
	_ "unsafe"
)
func main(){
	var n1 float32 = 12.830183430183430183555577552278
	//结果:n1= 12.830183,精度损失
	fmt.Println("n1=", n1)
}

浮点数使用细节:

  1. Golang 浮点类型有固定的范围和字段长度,不受具体 OS(操作系统)的影响
  2. Golang的浮点数默认是float64【开发中一般使用float64】
package main
import (
	"fmt"
	_ "unsafe"
)
func main(){
	var num = 6.8
	fmt.Printf("num的类型是 %T ", num)
	fmt.Println("num=", num)
	//num的类型是 float64 num= 6.8
}

在这里插入图片描述

2.2.3 字符型

Go中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存

  • 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。
  • 传统的字符串是由字符组成的,Go的字符串则是由字节组成的
  • Go统一使用了UTF-8编码,因此避免了乱码的情况

在这里插入图片描述

  • Go语言使用的是UTF8编码,3) 如 果 想 查 询 字 符 对 应 的 utf8 码 值:
    http://www.mytju.com/classcode/tools/encode_utf8.asp
  • 英文字母-1 个字节 汉字-3 个字节
  • 在 Go 中,字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的码值。
  • 可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的 unicode 字符
package main
import (
	"fmt"
	_ "unsafe"
)
func main(){
	var c1 int = 'a'
	var c2 int64 = '中'
	fmt.Println("c1=", c1, " c2=", c2)
	fmt.Printf("c1=%c, c2=%c", c1, c2)
	//结果:
	// c1= 97  c2= 20013
	// c1=a, c2=中
}
  • 字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来存储:

字符—>对应码值 >二进制–>存储
读取:二进制----> 码值 ----> 字符 --> 读取

2.3.4 布尔型

  • 布尔类型,也叫:bool,只允许取true或者false
  • 占1个字节
  • 适用于逻辑运算

在这里插入图片描述

2.3.5 基本数据类型相互转换

Golang 和 java / c 不同,Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Golang 中数据类型不能自动转换。【因此,等号两边得数值需要是同一类型】

  • 表达式 T(v) 将值 v 转换为类型 T
    T: 就是数据类型,比如 int32,int64,float32 等等
    v: 就是需要转换的变量
  • 在转换中,比如将 int64 转成 int8 【-128—127】 ,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。 因此在转换时,需要考虑范围.
package main
import (
	"fmt"
	_ "unsafe"
)
func main(){
	var num1 int64 = 897382715
	var num2 int8 = int8(num1)
	//num2=59
	fmt.Printf("num2=%v", num2)

}

在这里插入图片描述

2.3.6 基本数据类型与string转换

①fmt.Sprintf(“%参数”, 表达式)

更加灵活,推荐使用

在这里插入图片描述
在这里插入图片描述

package main
import (
	"fmt"
	_ "unsafe"
)
func main(){
	var num1 int = 20
	var str string
	str = fmt.Sprintf("%d", num1)
	//str type of string str="20"
	fmt.Printf("str type of %T str=%q", str, str)

}

②使用strconv

  • strconv.FormatXXX
    在这里插入图片描述

在这里插入图片描述

  • strconv.Itoa
    在这里插入图片描述
package main
import (
	"fmt"
	_ "unsafe"
	"strconv"
)
func main(){
	var num1 int = 20
	var str string
	//①strconv.FormatXXX
	str = strconv.FormatInt(int64(num1), 10)
	// str type of string, str="20"
	fmt.Printf("str type of %T, str=%q \n", str, str)
	//②strconv.Itoa
	var num2 int64 = 4135
	var str2 string = strconv.Itoa(int(num2))
	//str type of string , str="4135"
	fmt.Printf("str type of %T , str=%q", str2, str2)
}

2.3.7 string转基本数据类型

使用strconv包中得函数

在这里插入图片描述
在这里插入图片描述
注意:
在这里插入图片描述

package main
import (
	"fmt"
	_ "unsafe"
	"strconv"
)
func main(){
	var str string = "true"
	var b bool
	b , _ = strconv.ParseBool(str)
	//b type bool b=true
	fmt.Printf("b type %T b=%v\n", b, b)
}

注意:

在将 String 类型转成 基本数据类型时,要确保 String 类型能够转成有效的数据,比如 我们可以把 “123” , 转成一个整数,但是不能把 “hello” 转成一个整数,如果这样做,Golang 直接将其转成 0 , 其它类型也是一样的道理. float => 0 bool => false

package main
import (
	"fmt"
	_ "unsafe"
	"strconv"
)
func main(){
	var str4 string = "hello"
	var n3 int64 = 11
	//讲str4以十进制的形式转成int64
	n3, _ = strconv.ParseInt(str4, 10, 64)
	//n3之前是11,str4是字符串; 如果没有转成功,就返回0,因此n3被更新为0
	fmt.Printf("n3 type %T n3=%v\n", n3, n3)
}

2.3 指针

2.3.1 基本概念

  1. 基本数据类型,变量存的就是值,也叫值类型
  2. 获取变量的地址,用&,比如: var num int, 获取 num 的地址:&num 分析一下基本数据类型在内存的布局
  3. 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值
    在这里插入图片描述
    比如:var ptr *int = &num

举例说明:指针在内存中的布局
在这里插入图片描述

  1. 获取指针类型所指向的值,使用:*,比如:var ptr int, 使用ptr 获取 ptr 指向的值

在这里插入图片描述

  • 案例:

在这里插入图片描述

  1. 写一个程序,获取一个 int 变量 num 的地址,并显示到终端
  2. 将 num 的地址赋给指针 ptr , 并通过 ptr 去修改 num 的值
package main
import (
	"fmt"
	_ "unsafe"
	_ "strconv"
)
func main(){
	var num int = 43
	var ptr *int = &num
	*ptr = 20
	//num=20
	fmt.Printf("num=%d", num)
}

在这里插入图片描述

2.3.2 注意事项[值类型和引用类型]

①概念

  1. 值类型,都有对应的指针类型, 形式为 *数据类型,比如 int 的对应的指针就是 *int, float32
    对应的指针类型就是 *float32, 依次类推。
  2. 值类型包括:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct
  • 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct
  • 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型

②特点

值类型:变量直接存储值,内存通常在栈中分配
在这里插入图片描述

引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收
在这里插入图片描述

  • 内存的栈区和堆区示意图:
    在这里插入图片描述

2.4 标识符

  1. Golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符
  2. 凡是自己可以起名字的地方都叫标识符

2.4.1 标识符命名规则

  1. 由 26 个英文字母大小写,0-9 ,_ 组成
  2. 数字不可以开头。var num int //ok var 3num int //error
  3. Golang 中严格区分大小写。
    var num int var Num int
    说明:在 golang 中,num 和 Num 是两个不同的变量
  4. 标识符不能包含空格
  5. 下划线"_"本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用
  6. 不能以系统保留关键字作为标识符(一共有 25 个),比如 break,if 等等…

但是预定义标识符,如:int等,可以作为变量名【强烈不推荐!!!!】

2.4.2 注意事项

  1. 包名:保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和标准库不要冲突 fmt
    在这里插入图片描述
  2. 变量名、函数名、常量名:采用驼峰法

举例:
var stuName string = “tom” 形式: xxxYyyyyZzzz …

  1. 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用 ( 注:可以简单的理解成,首字母大写是公开的,首字母小写是私有的) ,在 golang 没有public , private 等关键字。
    在这里插入图片描述
    在这里插入图片描述

2.4.3 系统保留关键字与预定义标识符

  • 系统保留关键字
    在这里插入图片描述
  • 系统预定义标识符
    在这里插入图片描述

2.5 运算符

在这里插入图片描述

2.5.1 算数运算符使用【/、++、–、%】

①除号使用:/
在这里插入图片描述
②++、–使用:
在这里插入图片描述
在这里插入图片描述

  • Golang 的++ 和 – 只能写在变量的后面,不能写在变量的前面,即:只有 a++ a-- 没有 ++a
    –a
  • Golang 的设计者去掉 c / java 中的 自增自减的容易混淆的写法,让 Golang 更加简洁,统一。(强制性的)

③求余符号使用:%

  1. 对于除号 “/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如: x := 19/5 ,结果是 3
  2. 当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质运算。
package main
import (
	"fmt"
	_ "unsafe"
	_ "strconv"
	_ "go_code/project01/main/model"
)
func main(){
	//求余符号:%, 可以理解为符号不用看,最后结果与分母符号(如:10)一致
	fmt.Println("10 % 3 = ", 10 % 3)
	fmt.Println("-10 % 3 = ", -10 % 3)
	fmt.Println("10 % -3 = ", 10 % -3)
	fmt.Println("-10 % -3 = ", -10 % -3)
	// 10 % 3 =  1
	// -10 % 3 =  -1 
	// 10 % -3 =  1  
	// -10 % -3 =  -1
}

课堂练习:
在这里插入图片描述

2.6 进制

2.6.1 进制表示

二进制:0,1;满2进1
十进制:0-9,满10进1
八进制:0-7,以数字0开头表示,如:0726
十六进制:0-9及A-F,满16进1,以0x或0X开头,此处的A-F不区分大小写

在这里插入图片描述

2.6.2 进制转换

①二进制转其他进制:

  • 2转8:
    在这里插入图片描述
  • 2转10:
    每一位从2的0次方,2的一次方开始,如:012= 2*2^0+1*2^1+0*2^2
  • 2转16:
    在这里插入图片描述

②其他进制转二进制:

  • 8转2、10转2、16转2:
    一直除2,然后余数从下至上排列
    在这里插入图片描述

2.6.3 原码、补码、反码

在这里插入图片描述

分别是”按位与&、按位或|、按位异或^,它们的运算规则是:

  • 按位与& : 两位全为1,结果为 1,否则为 0
  • 按位或| : 两位有一个为 1,结果为 1,否则为 0
  • 按位异或 ^ : 两位一个为 0,一个为 1,结果为 1,否则为 0

注意事项

  1. Go语言中没有++a或- -a,
  2. Golang 的自增自减只能独立使用,不能直接后接赋值
//错误写法
a = i++

//正确写法
i++
a = i

面试题

①不使用中间变量,交换a、b的值

package main
import (
	"fmt"
	_ "unsafe"
	_ "strconv"
	_ "go_code/project01/main/model"
)
func main(){
	var a int = 9
	var b int = 13
	a = a + b
	b = a - b // a
	a = a - b
	fmt.Println("a===>", a) //13
	fmt.Println("b===>", b) //9
}

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

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

相关文章

UE4/5多人游戏详解(七、自定义委托,实现寻找会话和加入会话的函数,通过Steam进行两台电脑的联机)

目录 可能出现问题(在六部分的测试可能无法连接的问题【在末尾加上了,怕有人没看见在这里写一下】) 自定义委托 调整位置 创建更多的委托和回调函数给菜单: 多播和动态多播 代码: 委托变量 代码: 回…

( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度…

Linux: 进程间通信机制

文章目录 1. 前言2. 进程间通信机制2.1 管道2.1.1 匿名管道2.1.2 popen() 和 pclose()2.1.3 命名管道 FIFO 2.2 消息队列2.3 共享内存2.4 信号量2.5 网络套接字2.6 UNIX套接字2.7 信号 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给…

基于格密码的LWE问题

LWE LWE问题, Learning With Errors,带有安全性证明的第一个版本是由Oded Regev 在2005年提出,Kawachi等给出了效率的改进,接着一些效率方面非常重要的改进由Peikert等提出。 格理论知识 格密码学(Lattice-based Cr…

PTA L1-093 猜帽子游戏 (15 分)

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。每个人可以看到别人头上的帽子,但是看不到自己的。游戏开始后,每个人可以猜自己头上的帽子是什么颜色,或者可以弃权不猜。如果没有…

机器学习算法 决策树

文章目录 一、决策树的原理二、决策树的构建2.1 ID3算法构建决策树2.2 C4.5 算法树的构建2.3 CART 树的创建 三、决策树的优缺点 一、决策树的原理 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总…

NDK OpenCV人脸定位

NDK系列之OpenCV人脸定位技术实战,本节主要是通过OpenCV C库,实现识别人脸定位,并对识别到的人脸画面增加红框显示。 实现效果: 实现逻辑: 1.初始化CameraX,绑定图片分析器ImageAnalysis,监听…

7.队列算法

算法:队列算法 队列是一种抽象的数据结构,有点类似于Stacks。与堆栈不同,队列的两端都是开放的。一端始终用于插入数据(入队),另一端用于删除数据(出队)。队列遵循先进先出方法,即首先访问先存储的数据项。 一个真实的…

【C++初阶】类与对象(上)

一.什么是类,什么是对象 我们可以形象的把类比作是一个房子的设计图纸,而对象就是根据设计图纸设计出来的房子。 由设计图纸到房子的过程,我们称之为类的实例化。 C兼容C的,所以C中的结构体在C中也能用,但是C把结构体升…

rust教程 第一章 —— 初识rust

文章目录 前言一、Rust简介二、安装Rust编译器三、第一个Rust程序四、 IDE环境五、初识包管理六、总结 前言 本系列教程目录可查看这里:Rust教程目录 近些年来不断有新的语言崛起,比如当下非常火的go语言,不过相比于C,go语言确实…

C++类和对象 (3)

类和对象 1. 类的6个默认成员函数2. 构造函数2.1. 概念(问题提出)2.2. 特性 3.析构函数3.1. 概念3.2.特性 1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在…

使用OpenFeign实现接口访问

1. 引言 在微服务横行的年代,后端根据业务的不一样分成了很多单独运行的服务,比如在物联网中,根据业务拆分为定时服务、设备控制等服务。当前端想控制设备时,其请求首先到其对应的后端服务,后端服务再调用设备控制服务…

Vue+Vant封装通用模态框单选框组件

前言 我们知道,在vant组件中提供的组件往往是比较基础的,能够满足基本需求。但是我们想实现ui设计的一些比较丰富效果的组件,需要自己去实现,且当项目中多次用到的时候,我们将以组件化的思想将其封装起来,…

Node.js -- 使用Express写接口

1.创建基本的服务器 //导入express const express require(express) //创建服务器实例 const app express() //调用app.listen方法,指定端口号并启动web服务器 app.listen(80,function(){console.log(Express server running at http://127.0.0.1) })2. 创建API路…

路由交换综合实验

拓扑结构: 要求 1、R6为网络运营商(ISP),接口IP地址均为公有地址;该设备只能配置IP地址,之后不能在对其进行任何配置; 2、R1~R5为局域网,私有IP地址192.168.1.0/24,请合…

真题详解(UML图)-软件设计(五十五)

真题详解(计算机知识)-软件设计(五十四)https://blog.csdn.net/ke1ying/article/details/130278265 组织域名: com商业组织 edu教育组织 gov政府组织 net主要网络支持中心 mil军事部门 Int国际组织 2、时间复杂度 O&#…

写一个自己的命令行解释器

写一个自己的命令行解释器 当我点开xshell运行服务器的时候bash就被加载到了内存中,此后我在bash上执行的所有程序都是作为bash的子进程。在bash这个进程内创建子进程,并让子进程去执行全新的代码,这不就是程序替换吗? 所以我们…

腾讯云4核8g服务器支持多少人在线使用?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

【Unity入门】17.脚本访问父子结点

【Unity入门】脚本访问父子结点 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)父级节点 (1)访问父级节点 父子关系我们并不陌生,在cocos中常用node:get…

单链表的实现

链表的概念与结构 链表与我们通讯录中的顺序表是不同的,顺序表的空间是连续的,像数组一样可以通过下标访问。而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。即:链表…