「笔记」GO的数据类型及转换方法

2021-10-25  本文已影响0人  花森文宝

作为前端,面对强类型的后台难免犯怵,给自己整理一份笔记,既是巩固记忆也是梳理思路。

一、数据类型

1、数据类型分类

序号 类型 描述
1 布尔型 布尔型的值只可以是常量 true 或者 false
2 数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
3 字符串类型 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
4 派生类型 包括:指针类型(Pointer)、数组类型、结构化类型(struct)、Channel 类型、函数类型、 切片类型、接口类型(interface)、Map 类型

2、数字类型

前端数字类型只有Number和NaN,而Go区分int、float、uint等,不同类型内存要求都不一样。

整型
序号 类型 描述
1 uint8 无符号 8 位整型 (0 到 255)
2 uint16 无符号 16 位整型 (0 到 65535)
3 uint32 无符号 32 位整型 (0 到 4294967295)
4 uint64 无符号 64 位整型 (0 到 18446744073709551615)
5 int8 有符号 8 位整型 (-128 到 127)
6 int16 有符号 16 位整型 (-32768 到 32767)
7 int32 有符号 32 位整型 (-2147483648 到 2147483647)
8 int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
浮点型
序号 类型 描述
1 float32 IEEE-754 32位浮点型数
2 float64 IEEE-754 64位浮点型数
3 complex64 32 位实数和虚数
4 complex128 64 位实数和虚数
其他数字类型
序号 类型 描述
1 byte 类似 uint8
2 rune 类似 int32
3 uint 32 或 64 位
4 int 与 uint 一样大小
5 uintptr 无符号整型,用于存放一个指针

二、类型转换

前端常常用到隐式转换,后台没有,只能靠自己转。

1、简单转换

Go允许在底层结构相同的两个类型之间互转。

a := 5.0
b := int(a)

对于底层类型不同的转换可以借助一些专门的函数包。

2、strconv包

strconv包提供了字符串与简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。strconv包中的函数分为以下几大类:

还有其他一些基本用不上的函数,见官方手册:go doc strconv或者https://golang.org/pkg/strconv/

string和int相互转换
// Itoa(): int -> string
println("a" + strconv.Itoa(32))  // a32
// Atoi(): string -> int
i,_ := strconv.Atoi("3")
println(3 + i)   // 6

// Atoi()转换失败
i,err := strconv.Atoi("a")
if err != nil {
    println("converted failed")
}
Parse类函数

Parse类函数用于转换字符串为给定类型的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)

ParseFloat() 只能接收 float64 类型的浮点数。

ParseInt()和ParseUint()有3个参数:

func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)

以10进制方式解析"-42",保存为int64类型:

i, _ := strconv.ParseInt("-42", 10, 64)

以5进制方式解析"23",保存为int64类型,因为5进制的时候,23表示进位了2次,再加3,所以对应的十进制数为5*2+3=13。

i, _ := strconv.ParseInt("23", 5, 64)
println(i)    // 13

以16进制解析23,保存为int64类型,因为16进制的时候,23表示进位了2次,再加3,所以对应的十进制数为16*2+3=35。

i, _ := strconv.ParseInt("23", 16, 64)
println(i)    // 35

以15进制解析23,保存为int64类型,因为15进制的时候,23表示进位了2次,再加3,所以对应的十进制数为15*2+3=33。

i, _ := strconv.ParseInt("23", 15, 64)
println(i)    // 33
Format类函数

将给定类型格式化为string类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()。

s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)

FormatInt()和FormatUint()有两个参数:

func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string

第二个参数base指定将第一个参数转换为多少进制,有效值为2<=base<=36。当指定的进制位大于10的时候,超出10的数值以a-z字母表示。例如16进制时,10-15的数字分别使用a-f表示,17进制时,10-16的数值分别使用a-g表示。
例如:FormatInt(-42, 16)表示将-42转换为16进制数,转换的结果为-2a。

FormatFloat()参数众多:

func FormatFloat(f float64, fmt byte, prec, bitSize int) string
Append类函数

AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()。

Append类的函数和Format类的函数工作方式类似,只不过是将转换后的结果追加到一个slice中。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 声明一个slice
    b10 := []byte("int (base 10):")
    
    // 将转换为10进制的string,追加到slice中
    b10 = strconv.AppendInt(b10, -42, 10)
    fmt.Println(string(b10))

    b16 := []byte("int (base 16):")
    b16 = strconv.AppendInt(b16, -42, 16)
    fmt.Println(string(b16))
}

输出结果:

int (base 10):-42
int (base 16):-2a
上一篇下一篇

猜你喜欢

热点阅读