Go语言入门19:类型转换
Table of Contents
Go 语言入门基础学习笔记之 Go 语言的类型转换
类型转换
Go 语言类型转换基本格式如下:
type_name(expression)
type_name
为类型,expression
为表达式或变量。
Go 不支持隐式转换类型,类型不符合会直接报错
数值类型转换
整型 —> 浮点型
var a int = 10
var b float64 = float64(a)
字符类型转换
- 字符串 —> 整型
var str string = "10"
var num int
num, _ = strconv.Atoi(str)
除此之外,还有 strconv.ParseInt()
可以用于用于将字符串转换为整数类型(int64
),但是功能更强大。
func ParseInt(s string, base int, bitSize int) (int64, error)
参数
s
:要解析的字符串,必须符合整数格式。base
:指定数字的进制,常用的有:0
:自动识别进制(十进制、八进制、十六进制)。10
:十进制。2
:二进制。8
:八进制。16
:十六进制。
bitSize
:指定返回值的位数,通常为0
、8
、16
、32
或64
。
返回值
int64
:解析成功后返回的整数值。error
:如果解析失败,返回一个错误。
- 整型 —> 字符串
var str string
var num int = 10
str, _ = strconv.Itoa(num)
注意,strconv.Atoi()
和 strconv.Itoa()
函数返回两个值,第一个是转换后的值,第二个是可能发生的错误,我们可以使用空白标识符 _
来忽略这个错误。
同理,strconv.FormatInt()
将 int64
类型的整数转换为字符串,并支持指定进制。
func FormatInt(i int64, base int) string
参数
i
:要转换的int64
整数。base
:指定数字的进制,可以是0
(自动识别)、2
、8
、10
或16
。
- 字符串 —> 浮点数
var str string = "3.14"
num, err := strconv.ParseFloat(str, 64)
ParseFloat()
函数用于将字符串转换为浮点数(float64
)。如果字符串格式不正确,函数会返回一个错误。
func ParseFloat(s string, bitSize int) (float64, error)
参数
s
:要解析的字符串,必须是合法的浮点数格式(例如"3.14"
,"-2.5e10"
)。bitSize
:指定所需的浮点数精度,可以是32
或64
。这个参数影响返回值的精度和范围,但实际返回的类型始终是float64
。
返回值
float64
:解析成功后返回的浮点数。error
:如果解析失败,返回一个错误(nil
表示成功)。
- 浮点数 —> 字符串
var num = 3.14
str := strconv.FormatFloat(num, 'f', 2, 64)
FormatFloat()
函数用于将浮点数转换为字符串。你可以指定格式、精度和输出的位数。
func FormatFloat(f float64, fmt byte, prec int, bitSize int) string
参数
f
:要格式化的浮点数。fmt
:格式化方式,可以是以下四种之一:'f'
:表示固定小数点格式。'e'
:表示科学计数法(指数形式)。'g'
:根据数字的值自动选择格式,使用最简洁的表示法。
prec
:表示小数点后要保留的位数。如果为-1
,则会根据默认规则进行格式化。bitSize
:指定数字的位数,通常为32
或64
,表示浮点数的精度。
返回值
string
:格式化后的字符串表示。
接口类型转换
接口类型转换有两种情况:类型断言和类型转换。
类型断言
类型断言用于将接口类型转换为指定类型,其语法为:
value.(type)
// 或者
value.(T)
其中 value
是接口类型的变量,type
或 T
是要转换成的类型。
如果类型断言成功,它将返回转换后的值和一个布尔值,用于表示转换是否成功。断言失败返回该断言类型的零值。
package main
import "fmt"
func main() {
var i interface{} = "Hello, World"
str, ok := i.(string)
if ok {
fmt.Printf("'%s' is a string\n", str)
} else {
fmt.Println("conversion failed")
}
}
类型转换
类型转换用于将一个接口类型的值转换为另一个接口类型,其语法为:
T(value)
T
是目标接口类型,value
是要转换的值。
在类型转换中,我们必须保证要转换的值和目标接口类型之间是兼容的,否则编译器会报错。
package main
import "fmt"
// 定义一个接口 Writer
type Writer interface {
Write([]byte) (int, error)
}
// 实现 Writer 接口的结构体 StringWriter
type StringWriter struct {
str string
}
// 实现 Write 方法
func (sw *StringWriter) Write(data []byte) (int, error) {
sw.str += string(data)
return len(data), nil
}
func main() {
// 创建一个 StringWriter 实例并赋值给 Writer 接口变量
var w Writer = &StringWriter{}
// 将 Writer 接口类型转换为 StringWriter 类型
sw := w.(*StringWriter)
// 修改 StringWriter 的字段
sw.str = "Hello, World"
// 打印 StringWriter 的字段值
fmt.Println(sw.str)
}
解析:
- 定义接口和结构体:
Writer
接口定义了Write
方法。StringWriter
结构体实现了Write
方法。
- 类型转换:
- 将
StringWriter
实例赋值给Writer
接口变量w
。 - 使用
w.(*StringWriter)
将Writer
接口类型转换为StringWriter
类型。
- 将
- 访问字段:
- 修改
StringWriter
的字段str
,并打印其值。
- 修改
空接口类型
空接口 interface{}
是一种通用万能类型,可以持有任何类型的值。在实际应用中,空接口经常被用来处理多种类型的值。
Go 语言中的所有数据类型都实现了 interface{}
,根据多态的特性,只要实现一个接口,那么这个接口指针就指向那个类型,就可以用 interface{}
类型引用任意的数据类型。
如果你想定义一个函数,想要让它能够传递任意类型的变量,把形参定义为空接口类型即可。
func myFunc(arg interface{}) {
// 类型断言
value, ok := arg.(string)
if !ok {
fmt.Println("arg is not string type")
} else {
fmt.Println("arg is string type, value = ", value)
fmt.Println("value type is %T\n", value)
}
}
package main
import (
"fmt"
)
// printValue 函数接受一个空接口类型的参数 v
// 根据 v 的具体类型进行不同的处理
func printValue(v interface{}) {
// 使用类型断言的 switch 语句
switch v := v.(type) {
case int: // 如果 v 是 int 类型
fmt.Println("Integer:", v) // 打印整数值
case string: // 如果 v 是 string 类型
fmt.Println("String:", v) // 打印字符串值
default: // 如果 v 是其他类型
fmt.Println("Unknown type") // 打印未知类型的提示
}
}
func main() {
// 调用 printValue 函数,传入一个整数
printValue(42) // 输出: Integer: 42
// 调用 printValue 函数,传入一个字符串
printValue("hello") // 输出: String: hello
// 调用 printValue 函数,传入一个浮点数
printValue(3.14) // 输出: Unknown type
}
在这个例子中,printValue
函数接受一个空接口类型的参数,并使用类型断言和类型选择来处理不同的类型。
参考课程: