GO基础之基本数据类型

基本数据类型

整型

整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64

其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。

类型描述uint8无符号 8位整型 (0 到 255)uint16无符号 16位整型 (0 到 65535)uint32无符号 32位整型 (0 到 4294967295)uint64无符号 64位整型 (0 到 18446744073709551615)int8有符号 8位整型 (-128 到 127)int16有符号 16位整型 (-32768 到 32767)int32有符号 32位整型 (-2147483648 到 2147483647)int64有符号 64位整型 (-9223372036854775808 到 9223372036854775807)

特殊整型

类型描述uint32位操作系统上就是uint32,64位操作系统上就是uint64int32位操作系统上就是int32,64位操作系统上就是int64uintptr无符号整型,用于存放一个指针

注意: 在使用int和 uint类型时,不能假定它是32位或64位的整型,而是考虑int和uint可能在不同平台上的差异。

注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int和 uint。

数字字面量语法(Number literals syntax)

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

}

浮点型

Go语言支持两种浮点型数:float32和float64。这两种浮点型数据格式遵循IEEE 754 标准: float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。 float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。

打印浮点数时,可以使用fmt包配合动词%f,代码如下:

package main

import (

"fmt"

"math"

)

func main() {

fmt.Printf("%f\n", math.Pi)

fmt.Printf("%.2f\n", math.Pi)

}

复数

complex64和complex128

var c1 complex64

c1 = 1 + 2i

var c2 complex128

c2 = 2 + 3i

fmt.Println(c1)

fmt.Println(c2)

复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。

布尔值

Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。

注意:

1.布尔类型变量的默认值为

false

2.Go 语言中不允许将整型强制转换为布尔型.

3.布尔型无法参与数值运算,也无法与其他类型进行转换。

字符串

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

s1 := "hello"

s2 := "你好"

字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

转义符含义\r回车符(返回行首)\n换行符(直接跳到下一行的同列位置)\t制表符'单引号"双引号\反斜杠举个例子,我们要打印一个Windows平台下的一个文件路径:

package main

import (

"fmt"

)

func main() {

fmt.Println("str := "c:\Code\lesson1\go.exe"")

}

多行字符串

Go语言中要定义一个多行字符串时,就必须使用反引号字符:

s1 := 第一行 第二行 第三行

fmt.Println(s1)

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

字符串的常用操作

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

byte和rune类型

组成每个字符串的元素叫做"字符",可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(')包裹起来,如:

var a = '中'

var b = 'x'

Go 语言的字符有以下两种:

1.uint8

ASCII码

2.rune

UTF-8字符

当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。

Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

// 遍历字符串

func traversalString() {

s := "hello沙河"

for i := 0; i < len(s); i++ { //byte

fmt.Printf("%v(%c) ", s[i], s[i])

}

fmt.Println()

for _, r := range s { //rune

fmt.Printf("%v(%c) ", r, r)

}

fmt.Println()

}

输出:

104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)

104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)

因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

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

修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

func changeString() {

s1 := "big"

// 强制类型转换

byteS1 := []byte(s1)

byteS1[0] = 'p'

fmt.Println(string(byteS1))

复制代码
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2))

}

类型转换

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法如下:

T(表达式)

其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等.

比如计算直角三角形的斜边长时使用math包的Sqrt()函数,该函数接收的是float64类型的参数,而变量a和b都是int类型的,这个时候就需要将a和b强制类型转换为float64类型。

func sqrtDemo() {

var a, b = 3, 4

var c int

// math.Sqrt()接收的参数是float64类型,需要强制转换

c = int(math.Sqrt(float64(aa + b b)))

fmt.Println©

}

相关推荐
晚霞的不甘5 分钟前
Flutter for OpenHarmony天气卡片应用:用枚举与动画打造沉浸式多城市天气浏览体验
前端·flutter·云原生·前端框架
xkxnq19 分钟前
第五阶段:Vue3核心深度深挖(第74天)(Vue3计算属性进阶)
前端·javascript·vue.js
三小河26 分钟前
Agent Skill与Rules的区别——以Cursor为例
前端·javascript·后端
Hilaku32 分钟前
不要在简历上写精通 Vue3?来自面试官的真实劝退
前端·javascript·vue.js
三小河39 分钟前
前端视角详解 Agent Skill
前端·javascript·后端
牛奔1 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
Aniugel1 小时前
单点登录(SSO)系统
前端
颜酱1 小时前
二叉树遍历思维实战
javascript·后端·算法
鹏多多1 小时前
移动端H5项目,还需要react-fastclick解决300ms点击延迟吗?
前端·javascript·react.js
serioyaoyao1 小时前
上万级文件一起可视化,怎么办?答案是基于 ParaView 的远程可视化
前端