Go语言入门19:类型转换

Keywords: #技术 #Golang #Go 入门笔记
Table of Contents

Go 语言入门基础学习笔记之 Go 语言的类型转换

golang

类型转换

Go 语言类型转换基本格式如下:

type_name(expression)

type_name 为类型,expression 为表达式或变量。

Go 不支持隐式转换类型,类型不符合会直接报错

数值类型转换

整型 —> 浮点型

var a int = 10
var b float64 = float64(a)

字符类型转换

  1. 字符串 —> 整型
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:指定返回值的位数,通常为 08163264

返回值

  • int64:解析成功后返回的整数值。
  • error:如果解析失败,返回一个错误。
  1. 整型 —> 字符串
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(自动识别)、281016
  1. 字符串 —> 浮点数
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:指定所需的浮点数精度,可以是 3264。这个参数影响返回值的精度和范围,但实际返回的类型始终是 float64

返回值

  • float64:解析成功后返回的浮点数。
  • error:如果解析失败,返回一个错误(nil 表示成功)。
  1. 浮点数 —> 字符串
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:指定数字的位数,通常为 3264,表示浮点数的精度。

返回值

  • string:格式化后的字符串表示。

接口类型转换

接口类型转换有两种情况:类型断言类型转换

类型断言

类型断言用于将接口类型转换为指定类型,其语法为:

value.(type) 
// 或者 
value.(T)

其中 value 是接口类型的变量,typeT 是要转换成的类型。

如果类型断言成功,它将返回转换后的值和一个布尔值,用于表示转换是否成功。断言失败返回该断言类型的零值。

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)
}

解析:

  1. 定义接口和结构体
    • Writer 接口定义了 Write 方法。
    • StringWriter 结构体实现了 Write 方法。
  2. 类型转换
    • 将 StringWriter 实例赋值给 Writer 接口变量 w
    • 使用 w.(*StringWriter) 将 Writer 接口类型转换为 StringWriter 类型。
  3. 访问字段
    • 修改 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 函数接受一个空接口类型的参数,并使用类型断言类型选择来处理不同的类型。


参考课程:

  1. 8小时转职Golang工程师
  2. Go语言教程 | 菜鸟教程