首页 后端开发 Golang go语言数据类型转换教程

go语言数据类型转换教程

Dec 30, 2019 pm 05:49 PM
go语言

go语言数据类型转换教程

Go不会对数据进行隐式的类型转换,只能手动去执行转换操作。下面我们来看一下go语言中进行数据类型转换的方法 。

简单的转换操作

转换数据类型的方式很简单。

valueOfTypeB = typeB(valueOfTypeA)
登录后复制

例如:

// 浮点数
a := 5.0

// 转换为int类型
b := int(a)
登录后复制

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

// IT类型的底层是int类型
type IT int

// a的类型为IT,底层是int
var a IT = 5

// 将a(IT)转换为int,b现在是int类型
b := int(5)

// 将b(int)转换为IT,c现在是IT类型
c := IT(b)
登录后复制

但注意:

1、不是所有数据类型都能转换的,例如字母格式的string类型"abcd"转换为int 肯定会失败

2、低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。例如int32转 换为int16,float32转换为int

3、这种简单的转换方式不能对int(float)和string进行互转,要跨大类型转换,可以使用 strconv包提供的函数

strconv

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

这个包里提供了很多函数,大概分为几类:

1、字符串转int:Atoi()

2、int转字符串: Itoa()

3、ParseTP类函数将string转换为TP类型:ParseBool()、ParseFloat()、ParseInt()、 ParseUint()。因为string转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转 换成功

4、FormatTP类函数将其它类型转string:FormatBool()、FormatFloat()、FormatInt()、 FormatUint()

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

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

当有些类型无法转换时,将报错,返回的错误是strconv包中自行定义的error类型。有两种 错误:

var ErrRange = errors.New("value out of 

range")
var ErrSyntax = errors.New("invalid syntax")
登录后复制

例如,使用Atoi("a")将"a"转换为int类型,自然是不成功的。如果 print输出err信息,将显示:

strconv.Atoi: parsing "a": invalid 

syntax
登录后复制

string和int的转换

最常见的是字符串和int之间的转换:

1.int转换为字符串:Itoa()

// Itoa(): int -> string
println("a" + strconv.Itoa(32))  // a32
登录后复制

2.string转换为int:Atoi()

func Atoi(s string) (int, error)
登录后复制

由于string可能无法转换为int,所以这个函数有两个返回值:第一个返回值是转换成int的 值,第二个返回值判断是否转换成功。

// 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)
登录后复制

bitSize参数表示转换为什么位的int/uint,有效值为0、8、16、32、64。当bitSize=0的时 候,表示转换为int或uint类型。例如bitSize=8表示转换后的值的类型为int8或uint8。

base参数表示以什么进制的方式去解析给定的字符串,有效值为0、2-36。当base=0的时候 ,表示根据string的前缀来判断以什么进制去解析:0x开头的以16进制的方式去解析,0开头的 以8进制方式去解析,其它的以10进制方式解析。

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

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

64)
登录后复制

以5进制方式解析"23",保存为int64类型:

i, _ := strconv.ParseInt("23", 5, 64)
println(i)    // 13
登录后复制

因为5进制的时候,23表示进位了2次,再加3,所以对应的十进制数为5*2+3=13。

以16进制解析23,保存为int64类型:

i, _ := strconv.ParseInt("23", 16, 64)
println(i)    // 35
登录后复制

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

以15进制解析23,保存为int64类型:

i, _ := strconv.ParseInt("23", 15, 64)
println(i)    // 33
登录后复制

因为15进制的时候,23表示进位了2次,再加3,所以对应的十进制数为15*2+3=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
登录后复制

bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。

fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制) 、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、 'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很 大时用'E'格式,否则'f'格式)。

prec控制精度(排除指数部分):对'f'、'e'、'E',它表示小 数点后的数字个数;对'g'、'G',它控制总的数字个数。如果prec 为-1,则 代表使用最少数量的、但又必需的数字来表示f。

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
登录后复制

更多golang知识请关注golang教 程栏目。

以上是go语言数据类型转换教程的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? 在 Go 语言中,为什么使用 Println 和 string() 函数打印字符串会出现不同的效果? Apr 02, 2025 pm 02:03 PM

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

Go语言中`var`和`type`关键字定义结构体的区别是什么? Go语言中`var`和`type`关键字定义结构体的区别是什么? Apr 02, 2025 pm 12:57 PM

Go语言中结构体定义的两种方式:var与type关键字的差异Go语言在定义结构体时,经常会看到两种不同的写法:一�...

Go语言中哪些库是由大公司开发或知名的开源项目提供的? Go语言中哪些库是由大公司开发或知名的开源项目提供的? Apr 02, 2025 pm 04:12 PM

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...

GoLand中自定义结构体标签不显示怎么办? GoLand中自定义结构体标签不显示怎么办? Apr 02, 2025 pm 05:09 PM

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

使用 sql.Open 时,DSN 传空为什么不报错? 使用 sql.Open 时,DSN 传空为什么不报错? Apr 02, 2025 pm 12:54 PM

使用sql.Open时,DSN传空为什么不报错?在Go语言中,sql.Open...

See all articles