1. go语言的数据类型简介
golang的数据类型分为两大类,一类是基本数据类型和符合数据类型;
按照传递的内容分:传递本身数据和传递地址;
golang和java很相似,都是值传递,不过分为传递的值和传递的地址,传递地址的叫做引用传递;
2.基本数据类型
基本数据类型有:整数、浮点数、布尔型、字符
2.1 整数类型
(1)介绍
|--------|----------------|------|------|
| 类型 | 范围 | 占用空间 | 有无符号 |
| int8 | -2^7到2^7-1 | 1个字节 | 有 |
| int16 | -2^15到2^15-1 | 2个字节 | 有 |
| int32 | -2^31到2^31-1 | 4个字节 | 有 |
| int64 | -2^63到2^63-1 | 8个字节 | 有 |
| uint8 | 0到2^8-1 | 1个字节 | 无 |
| uint16 | 0到2^16-1 | 2个字节 | 无 |
| uint32 | 0到2^32-1 | 4个字节 | 无 |
| uint64 | 0到2^64-1 | 8个字节 | 无 |
注意: 在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑 int 和 uint可能在不同平台上的差异。
注意事项: 实际项目中整数类型、切片、 map 的元素数量等都可以用 int 来表示。
在涉及 到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使 用 int 和 uint 。
(2)整数常见的进制以及占位符表示
Go
package main
import "fmt"
func main() {
//二进制
a := 0b1001
fmt.Printf("%d \n", a)
fmt.Printf("%b \n", a)
//十进制
b := 0377
fmt.Printf("%o \n", b)
//十六进制
c := 0xff
fmt.Printf("%d \n", c)
// 显示数据的数据类型
fmt.Printf("%T \n",c)
}
2.2 浮点数
|---------|------|----------------------|
| 类型 | 存储空间 | 范围 |
| float32 | 4字节 | -3.403e38~3.403e38 |
| float64 | 8字节 | -1.798e308~1.798e308 |
Go
import (
"fmt"
"unsafe"
)
func main() {
var float1 float32 = 1.23
fmt.Printf("%f \n", float1) //默认保留6位小数
fmt.Printf("%.2f \n", float1)
//float32 占用4位,并且类型位float32
var a float32 = 3.14
fmt.Printf("值为%v--%f,类型%T\n", a, a, a)
fmt.Println(unsafe.Sizeof(a)) //占4个字节
//float64 占用8位,并且类型位float64
var b float64 = 1.23
fmt.Printf("值为%v--%f,类型%T\n", b, b, b)
fmt.Println(unsafe.Sizeof(b))
}
Golang 中 float 精度丢失问题
几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定
长条件下,二进制小数和十进制小数互转可能有精度丢失。这个问题在银行系统中特别致命。
如何解决:在java中有一个叫做bigdecimal的类可以解决这个问题,在golang中也有一个decimal可以解决这个问题
Go
package main
import (
"fmt"
"github.com/shopspring/decimal"
)
func main() {
decimal1, err := decimal.NewFromString("1129.6")
decimal2, err := decimal.NewFromString("100")
result := decimal1.Mul(decimal2)
if err != nil {
fmt.Println("转化失败:", err)
}
fmt.Println(result)
}
2.3 布尔类型
Go
var fl = false
if f1 {
fmt.Println("true")
} else {
fmt.Println("false")
}
2.4 字符串类型
Go语言里的字符串的内部实现使用UTF-8编码。字符串的值为双引号(")中的内容
字符串处理的基本方法
Go
package main
import (
"fmt"
"strings"
)
func main() {
var str string = "hello,world"
//len求字符串的长度
fmt.Println(len(str))
//fmt.sprintf拼接字符串
fmt.Println(fmt.Sprintf("我真的%s", "帅"))
//字符串中是否包含
fmt.Println(strings.Contains(str, "hello"))
//以,分割字符串
fmt.Println(strings.Split(str, ","))
arr := []string{"hello", "world"}
//拼接字符串,sep什么为间隔
fmt.Println(strings.Join(arr, ","))
//是否有后缀
fmt.Println(strings.HasSuffix(str, "world"))
//是否有前缀
fmt.Println(strings.HasPrefix(str, "hello"))
//子字符串最开始出现的位置
fmt.Println(strings.Index(str, "ell"))
//子字符串最后开始出现的位置
fmt.Println(strings.LastIndex(str, "l"))
}
2.5字符
组成每个字符串的元素叫做 "字符",可以通过遍历字符串元素获得字符。字符用单引号 '' 包裹起来
Go语言中的字符有以下两种类型
uint8类型:或者叫byte型,代表了ACII码的一个字符
rune类型:代表一个UTF-8字符
当需要处理中文,日文或者其他复合字符时,则需要用到rune类型,rune类型实际上是一个int32
Go使用了特殊的rune类型来处理Unicode,让基于Unicode的文本处理更为方便,也可以使用byte型进行默认字符串处理,性能和扩展性都有照顾。
需要注意的是,在go语言中,一个汉字占用3个字节(utf-8),一个字母占用1个字节
Go
package main
import "fmt"
func main() {
var a byte = 'a'
fmt.Println(a)
fmt.Printf("%c \n", a)
s := "你好,golang"
//使用len 循环相当于打印的是ascii码
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c)\t", s[i], s[i])
}
//通过rune打印的是 utf-8字符
for i, i2 := range s {
fmt.Println(i, i2)
}
s1 := "golang"
byte1 := []byte(s1)
byte1[0] = 'o'
fmt.Println(string(byte1))
s2 := "你好,世界"
byte2 := []rune(s2)
byte2[0] = '不'
fmt.Println(string(byte2))
}
3.基本数据类型的转化
3.1数值类型的转化
Go
package main
import "fmt"
func main() {
var a int16 = 8
var b int64 = 16
fmt.Println(int64(a) + b)
var c int8 = 12
var d float32 = 32
fmt.Println(float32(c) + d)
}
3.2 转化成字符串
Go
import (
"fmt"
"strconv"
)
func main() {
//通过sprint转化成字符串
s1 := fmt.Sprintf("%d", 1)
fmt.Println(s1)
//痛殴strconv转化
var num float64 = 3.14
fmt.Println(strconv.FormatFloat(num, 'f', -1, 64))
}
3.3 字符串转化成int和float类型
Go
import (
"fmt"
"strconv"
)
func main() {
str := "10"
str2 := "3.14"
fmt.Println(strconv.ParseInt(str, 10, 64))
fmt.Println(strconv.ParseFloat(str2, 64))
}