【Go-07】Go语言中数据类型详解

一Go到底 / 2022-11-10

🚀Go语言中数据类型的详解

📓推荐网站(不断完善中):个人博客

📌个人主页:个人主页

👉相关专栏:CSDN专栏个人专栏

🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚

title

🏖前言

在上一篇文章中,博主对于Go语言中的变量进行了进一步的解析

那么在本篇文章中,则针对于数据类型好好的进行讲解一番

那么我们就看以下内容!

关于数据类型的表格则可以详看:具体数据类型表格


1.整型

在Go语言中同时为我们提供了有符号和无符号的数据类型

在于初期最明显的表达就应该是数值范围的不同。

整型在Go中包含

  • 有符号整型:int、int8、int64、int32、int64
    • 有符号整型范围:-2^(n-1) 到 2^(n-1)-1
  • 无符号整型:uint、uint8、uint64、uint32、uint64、uintptr
    • 无符号整型范围: 0 到 2^n-1

实际开发中由于编译器和计算机硬件的不同,int 和 uint 所能表示的整数大小会在 32bit 或 64bit 之间变化。

1.1.应用场景

可能在学习别的语言的时候,在整数部分很少遇到这么多种类型的数。

那么一定就会疑惑为什么需要这么多类型呢?其实很大一部分原因是和开发对接的环境有一定的关系。

Go是一个相对来说比较全面的后端语言,软硬件都可以支持与对接,面对不同的系统需要有这些不同位数的数据类型来进行支撑与支持。

一般来说:uint在硬件开发中使用场景比较多。用来表示 Unicode 字符的 rune 类型int32 类型是等价的,通常用于表示一个 Unicode 码点。这两个名称可以互换使用。同样,byteuint8 也是等价类型,byte 类型一般用于强调数值是一个原始的数据而不是一个小的整数。

无符号的整数类型 uintptr,它没有指定具体的 bit 大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。

1.2.简单的案例

Go1.13版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:

v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。 v := 0o377,代表八进制的 377,相当于十进制的 255。 v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。

而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。

我们可以借助fmt函数来将一个整数以不同进制形式展示。

package main
 
import "fmt"
 
func main(){
	// 十进制
	var a int = 10
	fmt.Printf("%d \n", a)  // 10
	fmt.Printf("%b \n", a)  // 1010  占位符%b表示二进制
 
	// 八进制  以0开头
	var b int = 077
	fmt.Printf("%o \n", b)  // 77
 
	// 十六进制  以0x开头
	var c int = 0xff
	fmt.Printf("%x \n", c)  // ff
	fmt.Printf("%X \n", c)  // FF
}

2.浮点型

浮点型,我们常见的一种生活中的说话就是小数,但是细致来说并不止是这样。

Go语言的浮点型则支持两种:float32float64。这两种浮点型数据格式遵循IEEE 754标准。

float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32

float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

细节处理

  • 浮点数在声明的时候可以只写整数部分或者小数部分
var e = .71828 // 0.71828
var f = 1.     // 1
fmt.Printf("%.5f,%.1f",e,f)
  • 很小或很大的数最好用科学计数法书写,通过 e 或 E 来指定指数部分
var avogadro = 6.02214129e23  // 阿伏伽德罗常数
var planck   = 6.62606957e-34 // 普朗克常数
fmt.Printf("%f,%.35f",avogadro,planck)

3.复数

Go语言中复数的类型有两种,分别是 complex128(64 位实数和虚数)complex64(32 位实数和虚数),其中 complex128 为复数的默认类型。

在计算机中,复数是由两个浮点数表示的,其中一个表示实部(real),一个表示虚部(imag)

复数的语法格式

变量名 := complex(x, y)

案例

var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)

4.布尔型

用通俗一点的方式来说的话,就是真(true)假(false)的判断

⚠️注意

  1. 布尔类型变量的默认值为false
  2. Go 语言中不允许将整型强制转换为布尔型.
  3. 布尔型无法参与数值运算,也无法与其他类型进行转换。

4.1.细节说明

布尔值我们通常在应用比较多的地方为运算后的条件判断

==,>,<<=, >=,&&(AND),||(OR)等都会产生bool值

var aVar = 10
aVar == 5  // false
aVar == 10 // true
aVar != 5  // true
aVar != 10 // false

⚠️注意

Go语言对于值之间的比较有非常严格的限制,只有两个相同类型的值才可以进行比较,如果值的类型是接口(interface),那么它们也必须都实现了相同的接口。

如果其中一个值是常量,那么另外一个值可以不是常量,但是类型必须和该常量类型相同。

5.字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符。

5.1.字符串转义字符

在字符串中有许多的转义字符可以完成一些特定的字符功能,比如换行、缩进等效果。

常用的转义字符包括:

  • \n:换行符
  • \r:回车符
  • \t:tab 键
  • \u 或 \U:Unicode 字符
  • \:反斜杠自身

案例

package main
import (
    "fmt"
)
func main() {
    var str = "测试\n转义字符串"
    fmt.Println(str)
}

输出结果的时候可以看到测试转义字符串这两个应该中间会有一个换行。

输出结果

测试

转义字符串

5.2.多行字符串的定义

在Go中,如果你想一下子写多行的内容(比如大量的文本内容),那么其实可以使用反引号

但是在使用反引号的时候会导致转义字符失效

案例

package main

import (
	"fmt"
)

func main() {
	s1 := `第一行
  第二行
  第三行`
fmt.Println(s1)
}

输出结果:

第一行
第二行
第三行

5.3.字符串拼接

+号在数学中表示的是运算,但是运用在字符串上则表示的是将两个字符串连接在一起

比如两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。将 s2 追加到 s1 尾部并生成一个新的字符串 s。

案例

package main

import "fmt"

func main() {
	s1 := "这是字符串s1"
	s2 := "这是字符串s2"
	s := s1 + s2
	fmt.Println("这是拼接后的字符串:", s)
}

输出的结果为:

这是拼接后的字符串: 这是字符串s1这是字符串s2


当然我们还可以更灵活一点,可以通过下面的方式来对代码中多行的字符串进行拼接

str := "Beginning of the string " +
"second part of the string"

或者说我们还可以认识一个新的符号 +=,我们平常用 :=来进行赋值,现在我们可以用+=来进行字符串的拼接

案例代码

s := "hel" + "lo,"
s += "world!"
fmt.Println(s) //输出 “hello, world!”

5.4.说说字符串的一些常用操作

我们在使用字符串的时候,可能会经常遇到的场景,比如算这个字符串的长度、在一段字符串中添加内容、切割这段字符串、判断字符串中是否包含某些字符等等,因此我在此给大家列出我们比较常用的一些函数,在后续的教程中我们慢慢的用上他们,先过个眼熟。

方法 介绍
len(str) 求长度
+或fmt.Sprintf 拼接字符串(带格式化)
strings.Split 分割
strings.contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) join操作

大家可以看到,这些方法中很多都是strings打头,其实他也是我们Go语言中本身自带的一个处理字符串的工具,就像我们的fmt一样。

所以依此类推,当我们要使用以上带有strings的方法时,我们需要在头部import strings

5.5.拆开字符串说字符

我们可以看到如果说我们有这么一段内容聪明的墨菲特

以上内容我们称之为字符串

而如果将里面的内容拆开,里面的每个字我们则称之为字符

在Go语言中字符分两种:

  1. uint8类型,或者叫 byte 型,代表一个ASCII码字符。
  2. rune类型,代表一个 UTF-8字符

其实简单解释来说,就是我们的汉字日语这些文字,我们用的是rune类型(因为底层超出byte类型取值范围)

而我们常见的英文单词这些,则是uint8类型,可以与ASCII码表对应上。ASCII码表查看

我们可以用这个案例看看

注意:定义字符串我们用的是"",但是定义字符我们用的是''

package main

import "fmt"

func main() {
	// 定义一个rune类型字符
	c1 := '张'
	// 定一个byte类型字符
	c2 := 'x'
	// 分别进行输出
	fmt.Print("输出字符:", c1, c2)
}

得到结果为:

输出字符:24352 120

从结果我们可以看到,字符x输出的ASCII码值为120而中文则远超byte的取值范围,所以这是不同类型字符的区别。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

🏜写在最后

本篇的内容到这里就告一段落啦。主要是对于Go语言中的各种数据类型进行了更进一步的介绍,让大家能更深入的了解这些数据类型

也随着学习逐渐深入,在此给大家留下一些扩展的小练习。

🖌️浑水摸练

  • 编写代码分别定义一个整型、浮点型、布尔型、字符串型变量,使用fmt.Printf()搭配%T分别打印出上述变量的值和类型。

快乐与分享!