第7节 Go中的数据类型转换

268 阅读2分钟

  Go中的不同类型的变量之间赋值时需要显示转换,也就是说Go中的数据类型不能自动转换,这和 java 语言是有差别的,比如 java 中的 int 类型的变量可以赋值给 long 类型。

1. 数值类型之间的转换

  • T(v) : 将值 v 转换为数据类型 T
package main

import (
	"fmt"
	"reflect"
)

func main() {
	var a int = 3;
	var b float64 = float64(a)
	//a的类型:int,a=3,b=3
	fmt.Printf("a的类型:%v,a=%v,b=%v\n",reflect.TypeOf(a),a,b)
}

注意:

  • 被转换的是变量保存的值,变量本身的数据类型是不会发生改变的
  • 小心转换结果溢出,比如将 int 转换成 int8
package main

import (
	"fmt"
	"reflect"
)

func main() {
    var c int = 350
    var f int8 = int8(c)
    // c的类型:int,c=350,f=94
    fmt.Printf("c的类型:%v,c=%v,f=%v\n",reflect.TypeOf(c),c,f)
    
    var n int = 12
    var k int8 = int8(n) + 127
    // -117,因为溢出,导致计算结果不对
    fmt.Println(k)
}
  • 不同类型变量在组合使用前,必须先转换成同一种数据类型
package main

import "fmt"

func main() {
    // 编译报错:cannot use n1 + 12 (value of type int32) as type int64 in assignment
    // n2 = n1 + 12

    // 正确的使用方式
    n2 = int64(n1) + 12
    fmt.Println(n2)
}

2. 数值类型 和 字符串类型转换

2.1 数值类型 转 string

2.1.1 使用 fmt 包的 func Sprintf

image.png

package main

import "fmt"

func main() {
	var str string

	// int 类型转 string
	var n int = 290
	str = fmt.Sprintf("int to string, str=%d",n)
	fmt.Printf("data type : %T, str=%s\n",str,str)

	// byte 类型转 string
	var b byte = 12
	str = fmt.Sprintf("byte to string, str=%d",b)
	fmt.Printf("data type : %T, str=%s\n",str,str)

	// float32 类型转 string
	var f float32 = 43.23
	str = fmt.Sprintf("float32 to string, str=%f",f)
	fmt.Printf("data type : %T, str=%s\n",str,str)

	// float64 类型转 string
	var f2 float64 = 43.23
	str = fmt.Sprintf("float64 to string, str=%f",f2)
	fmt.Printf("data type : %T, str=%s\n",str,str)
}

image.png

2.1.2 使用 strconv 包中的函数

  • boolstring
func FormatBool(b bool) string
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var str2 bool = true

	b := strconv.FormatBool(str2)
	fmt.Printf("b=%v\n", b)
}
// byte 指定格式,可选 'f','b','e','E' 等
// prec 指定有效的小数位数
// bitSize 指定期望接收类型,32是float32;64是float64
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
package main

import (
	"fmt"
	"strconv"
)

func main() {
	v := 3.1415926

	s := strconv.FormatFloat(v, 'f' , 2 , 32)
	fmt.Printf("s=%v\n",s)

	s1 := strconv.FormatFloat(v, 'f' , 2 , 64)
	fmt.Printf("s=%v\n",s1)
}

image.png

  • int 转 string 的函数
func FormatInt(i int64, base int) string
func Itoa(i int) string
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var a int = 589
	a1 := strconv.Itoa(a)
	fmt.Printf("a=%v\n",a1)
}        

2.2 sting 转 数值类型

func ParseBool(str string) (value bool, err error)

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

func ParseFloat(s string, bitSize int) (f float64, err error)

注意

  • 将 string 转成数值类型时,要确保字符串是有效的数字类型字符串,比如我们可以把 "123" 转成一个整数,但不能把 "strconv" 转成一个整数,遇到这种情况 Go 转成的结果都按 0 处理