3.Go语言-数据类型
1.go语言数据类型
1.整型
-
整型分为以下两个大类: 按长度分为: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) -
特殊整型
类型 描述 uint 32位操作系统上就是 uint32
,64位操作系统上就是uint64
int 32位操作系统上就是 int32
,64位操作系统上就是int64
uintptr 无符号整型,用于存放一个指针 -
注意: 在使用
int
和uint
类型时,不能假定它是32位或64位的整型,而是考虑int
和uint
可能在不同平台上的差异。 -
注意事项 获取对象的长度的内建
len()
函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int
来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用int
和uint
。 -
Println & Printf 区别
package main
import "fmt"
//基本数据类型
func main() {
//十进制打印为二进制
n := 10
fmt.Printf("%b\n", n)
//十进制打印十进制
fmt.Printf("%d\n", n)
//八进制
m := 075
fmt.Printf("%d\n", m)
fmt.Printf("%o\n", m)
//十六进制
f := 0xff
fmt.Println(f)
fmt.Printf("%x\n", f)
}
//%b 二进制,%o 八进制 %x十六进制
2.浮点型:
-
Go语言支持两种浮点型数:
float32
和float64
。 -
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)//3.141593 fmt.Printf("%.2f\n", math.Pi)//3.14 }
- 打印浮点数时,可以使用
3.复数
-
complex64 和complex128
func main() { var c1 complex64 c1 = 1 + 2i var c2 complex128 c2 = 2 + 3i fmt.Println(c1)//(1+2i) fmt.Println(c2)//(2+3i) }
4.布尔值:
- 只有true,false(默认) 没有1,0之分
- 注意:
- 布尔类型变量的默认值位false
- Go语言中不允许将整型强制转换位布尔值
- 布尔型无法参与数值运算,也无法与其他类型进行转换。
package main
import (
"fmt"
"math"
)
//基本数据类型
func main() {
//十进制打印为二进制
n := 10
fmt.Printf("%b\n", n)
//十进制打印十进制
fmt.Printf("%d\n", n)
//八进制
m := 075
fmt.Printf("%d\n", m)
fmt.Printf("%o\n", m)
//十六进制
f := 0xff
fmt.Println(f)
fmt.Printf("%x\n", f)
//uint 8
var age uint8 //0~255
age = 255
fmt.Println(age)
//浮点数
fmt.Println(math.MaxFloat32)
fmt.Println(math.MaxFloat64)
//布尔值
var a bool
fmt.Println(a)
a = true
fmt.Println(a)
//字符串
s1 := "hello beijing"
s2 := "你好 北京"
fmt.Println(s1, s2)
//打印 一个路径c:\code\go.exe
fmt.Println("c:\\code\\go.exe")
fmt.Println("\t制表符\n换行符")
s3 := `
多行字符串
两个反引号内容
会原样输出\n\t
`
fmt.Println(s3)
}
5.字符串
- Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用
UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如: - 字符串转义符:
转义符 | 含义 |
---|---|
\r |
回车符(返回行首) |
\n |
换行符(直接跳到下一行的同列位置) |
\t |
制表符 |
\' |
单引号 |
\" |
双引号 |
\\ |
反斜杠 |
-
示例:
func main() { fmt.Println("path =\"c:\\code\\page\\go.exe\"") } // path ="c:\code\page\go.exe"
-
多行注释
- Go语言中要定义一个多行字符串时,就必须使用
反引号
字符:
words := `first second threed` fmt.Println(words)
- Go语言中要定义一个多行字符串时,就必须使用
-
字符串常用操作
方法 介绍 len(str) 求长度 +或fmt.Sprintf 拼接字符串 strings.Split 分割 strings.contains 判断是否包含 strings.HasPrefix,strings.HasSuffix 前缀/后缀判断 strings.Index(),strings.LastIndex() 子串出现的位置 strings.Join(a[]string, sep string) join操作 -
示例:
package main
import (
"fmt"
"strings"
)
//字符串常见操作
func main() {
//求字符串长度
s := "hello"
fmt.Println(len(s))
s2 := "hello中国"
fmt.Println(len(s2))
//拼接字符串
fmt.Println(s + s2)
s3 := fmt.Sprintf("%s - %s", s, s2)
fmt.Println(s3)
//字符串的分割
s4 := "how do you do"
fmt.Println(strings.Split(s4, " "))
//判断是否包含
fmt.Println(strings.Contains(s4, "do"))
//判断前缀
fmt.Println(strings.HasPrefix(s4, "how"))
//判断后缀
fmt.Println(strings.HasSuffix(s4, "how"))
//判断子串的位置
fmt.Println(strings.Index(s4, "do"))
//最后子串出现的位置
fmt.Println(strings.LastIndex(s4, "do"))
//join
s5 := []string{"how", "do", "you", "do"}
fmt.Println(s5)
fmt.Println(strings.Join(s5, "+"))
}
-
byte和rune区别
- byte:给存储ascii码类型起的别名
- rune:给存储unicode码类型起的别名
package main import "fmt" //字符 func main() { //byte unit8的别名 ASCII码 //rune int32的别名 var c1 byte = 'c' var c2 rune = 'c' fmt.Println(c1, c2) //99 99 // %T 输出值的类型 fmt.Printf("c1:%T c2:%T\n", c1, c2) //c1:uint8 c2:int32 s := "hello中国" for i := 1; i < len(s); i++ { fmt.Printf("%c\n", s[i]) //按照索引遍历字符串。中文占好几个字节会出现乱码。 } // %c 输出Unicode的字符 for _, r := range s { fmt.Printf("%c\n", r) //按字符循环不会出现乱码 } }
练习题:
题目:百元百鸡,一百元钱买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1元3个。
解题思路 先找出100元最多可以买多少只鸡,再通过条件,找出符合要求的正确数字
package main
import "fmt"
func main() {
for i := 0; i <= 20; i++ {
for t := 0; t <= 33; t++ {
k := 100 - i - t
if i*5+t*3+k/3 == 100 && k%3 == 0 {
fmt.Println(i, t, k)
}
}
}
}
- 修改字符串:
- 修改字符串,需要先将它转换成[]rune或byte,再转换string,并复制给字节数组。
func main() {
s1 := "hello"
bytes1 := []byte(s1)
bytes1[0] = 'H'
// Hello
fmt.Println(string(bytes1))
s2 := "你好"
runes2 := []rune(s2)
runes2[0] = '不'
// 不好
fmt.Println(string(runes2))
}
-
类型转换
- go语言中类型转换只有强制类型转换,没有隐式类型转换。
- 如计算直角三角形的斜边长时,使用math包的Sqrt() 。该函数接收时float64类型参数
import "math" func main() { c,k := 3,4 var g int g = int(math.Sqrt(float64(c*c + k*k))) // 5 fmt.Println(g) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库