golang数据类型转换


文章目录

  • golang数据类型转换
  • 一、简单类型转换
  • 二、借用内置函数strconv进行转换
  • 1、Atoi()字符串类型转整型 (alphanumeric to integer)
  • 2、Itoa()整型转字符串类型(integer to alphanumeric)
  • 3、Parse系列函数转换(string转换为其他类型)
  • ParseBool()
  • ParseInt()
  • ParseUint()
  • ParseFloat()
  • 4、FormatType()系列函数转换(其他类型转换为string)
  • FormatBool()
  • FormatInt()、FormatUint()
  • FormatFloat()
  • 5、AppendType()系列函数转换(其他类型转换为string后加入切片中)


一、简单类型转换

1、对于相同底层结构类型的变量,go语言可以使用简单类型转换的方式
例如:byte转string

// 字符类型
var a byte = 'y'

// 转换为字符串类型
b := string(a)

int转float16

// int类型
a := 3

// int转float16
b := float16(a)

2、但是跨越大类型的转换使用这类简单的转换方式是不被允许的(例如:string和int、float、bool之间的转换)

二、借用内置函数strconv进行转换

strconv包中使用最多的函数主要有:
· 字符串转int:Atoi()
· int转字符串:Itoa()
· Parse系列函数将string转为其他类型:ParseType()
· Format系列函数将其他类型转为string:FormatType()
· Append系列函数将其他类型转为string并添加到slice:AppendType()

1、Atoi()字符串类型转整型 (alphanumeric to integer)

原函数类型:func Atoi(s string) (i int, err error)

package main

import (
	"fmt"
	"strconv"
)

//string转换为int
func main(){
	var str string = "12"
	i,err:= strconv.Atoi(str)
	if err != nil {
		// 转换失败!Type:int , Value:0
		fmt.Printf("转换失败!Type:%T , Value:%v", i, i)
	}else{
		// 转换成功!Type:int , Value:12
		fmt.Printf("转换成功!Type:%T , Value:%v", i, i)
	}
}

2、Itoa()整型转字符串类型(integer to alphanumeric)

原函数类型:func Itoa(i int) string

package main

import (
	"fmt"
	"strconv"
)

func main(){
	var str int = 32
	// 转换后结果:32
	fmt.Println("转换后结果:"+strconv.Itoa(str))
}

3、Parse系列函数转换(string转换为其他类型)

  • ParseBool()
  • ParseInt()
  • ParseUint()
  • ParseFloat()
ParseBool()

原函数类型:func ParseBool(str string) (value bool, err error)

package main

import (
	"fmt"
	"strconv"
)

func main(){
	// 当入参为"true"/"True"/"TRUE"/"t"/"T"/"1"时转换结果为True,否则为False
	var str string = "true"
	b,err := strconv.ParseBool(str)
	if err != nil {
		// 转换失败!Type:bool , Value:false
		fmt.Printf("转换失败!Type:%T , Value:%v", b, b)
	}else{
		// 转换成功!Type:bool , Value:true
		fmt.Printf("转换成功!Type:%T , Value:%v", b, b)
	}
}
ParseInt()

原函数类型:func ParseInt(s string, base int, bitSize int) (i int64, err error)
参数说明:

  • base 指定进制,取值范围是 2 到 36。如果 base 为 0,则会从字符串前置判断,“0x”是 16 进制,“0”是 8 进制,否则是 10 进制。
  • bitSize 指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64。
  • 返回的 err 是 *NumErr 类型的,如果语法有误,err.Error = ErrSyntax,如果结果超出类型范围 err.Error = ErrRange。
package main

import (
	"fmt"
	"strconv"
)

func main(){
	var str string = "123"
	b,err := strconv.ParseInt(str,10,64)
	if err != nil {
		// 转换失败!Type:int64 , Value:0
		fmt.Printf("转换失败!Type:%T , Value:%v", b, b)
	}else{
		// 转换成功!Type:int64 , Value:123
		fmt.Printf("转换成功!Type:%T , Value:%v", b, b)
	}

}
ParseUint()

原函数类型:func ParseUint(s string, base int, bitSize int) (n uint64, err error)
ParseUint()和ParseInt()在使用方式上类似,仅是入参需使用无符号整型

ParseFloat()

函数原型:func ParseFloat(s string, bitSize int) (f float64, err error)
参数说明:

  • 如果 s 合乎语法规则,函数会返回最为接近 s 表示值的一个浮点数(使用 IEEE754 规范舍入)。
  • bitSize 指定为64,只能返回float64类型的浮点数(当输入32时会得到异常数值。。。);
  • 返回值 err 是 *NumErr 类型的,如果语法有误 err.Error=ErrSyntax,如果返回值超出表示范围,返回值 f 为 ±Inf,err.Error= ErrRange。
package main

import (
   "fmt"
   "strconv"
)

func main(){
   var str string = "3.1415926"
   b,err := strconv.ParseFloat(str,64)
   if err != nil {
   	// 转换失败!Type:float64 , Value:0
   	fmt.Printf("转换失败!Type:%T , Value:%v", b, b)
   }else{
   	// 转换成功!Type:float64 , Value:3.1415926
   	fmt.Printf("转换成功!Type:%T , Value:%v", b, b)
   }

}

4、FormatType()系列函数转换(其他类型转换为string)

  • FormatBool()
  • FormatInt()
  • FormatUint()
  • FormatFloat()
FormatBool()

原函数类型:func FormatBool(b bool) string

// 传入参数为true,false
s := strconv.FormatBool(true)
FormatInt()、FormatUint()

原函数类型:func FormatInt/FormatUint(i int64/uint64, base int) string
参数base表示将数据以多少进制转换为string类型,base的有效值为2~36,从10 ~35以英文字母a ~z代替

package main

import (
	"fmt"
	"strconv"
)

func main(){
	// 入参类型为int64
	var i int64 = 71
	s := strconv.FormatInt(i,36)
	// Type:string , Value:1z
	fmt.Printf("Type:%T , Value:%v", s, s)
}
FormatFloat()

原函数类型:func FormatFloat(f float64, fmt byte, prec, bitSize int) string
参数说明:

  • 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
  • bitSize:指定数据类型,32表示float32,64表示float64
package main

import (
	"fmt"
	"strconv"
)

func main(){
	// 当丢失精度时并不遵循四舍五入规则,使用时需注意
	fmt.Println(strconv.FormatFloat(411517.135,'f',2,64)) // 411517.14
	fmt.Println(strconv.FormatFloat(411517.115,'f',2,64)) // 411517.11
	fmt.Println(strconv.FormatFloat(411517.135,'e',2,64)) // 4.12e+05
	fmt.Println(strconv.FormatFloat(411517.135,'f',-1,64)) // 411517.135
}

5、AppendType()系列函数转换(其他类型转换为string后加入切片中)

  • FormatBool:func AppendBool(slice []byte, b bool) []byte
  • FormatInt:func AppendInt(slice []byte, i int64, base int) []byte
  • FormatUint:func AppendUint(slice []byte, i uint64, base int) []byte
  • FormatFloat:func AppendFloat(slice []byte, f float64, fmt byte, prec, bitSize int) []byte
    相比于Format系列函数,Append系列函数新增了一个切片类型入参作为转换后的string要添加的对象
package main

import (
	"fmt"
	"strconv"
)

func main(){
	s := []byte("int (base 10):")
	fmt.Println(string(strconv.AppendBool(s,true))) // int (base 10):true
	fmt.Println(string(strconv.AppendInt(s,-123,10))) // int (base 10):-123
	fmt.Println(string(strconv.AppendUint(s,123,10))) // int (base 10):123
	fmt.Println(string(strconv.AppendFloat(s,-123.123,'f',2,64))) // int (base 10):-123.12
}

参考文章:
链接: Go基础系列:数据类型转换(strconv包) - 骏马金龙