golang的类型转换

简介: 【9月更文挑战第28天】本文介绍了Go语言中的基本数据类型转换,包括数值类型之间的转换及字符串与数值类型的互转,提供了具体代码示例说明如何使用如`float64(a)`和`strconv.Atoi`等方法。同时,文章还讲解了接口类型转换,包括类型断言和类型开关的使用方法,并展示了如何在运行时获取具体类型。最后,提到了指针类型转换的注意事项及其应用场景。
  1. 基本数据类型转换
  • 数值类型转换
  • 在 Go 语言中,不同的数值类型之间可以进行转换。例如,将一个int类型转换为float64类型。


package main
     
     import "fmt"
     
     func main() {
         var a int = 10
         var b float64 = float64(a)
         fmt.Println(b) 
     }


  • 这里通过float64(a)int类型的变量a转换为float64类型。需要注意的是,这种转换可能会导致精度损失或者溢出,特别是在将范围较大的整数类型转换为范围较小的整数类型时。例如,将一个很大的int64值转换为int8可能会超出int8的取值范围。
  • 字符串与数值类型转换
  • 字符串转数值:Go 语言提供了一些函数来将字符串转换为数值类型。例如,将一个字符串转换为int类型可以使用strconv.Atoi函数。


package main
     
     import (
         "fmt"
         "strconv"
     )
     
     func main() {
         str := "123"
         num, err := strconv.Atoi(str)
         if err == nil {
             fmt.Println(num)
         } else {
             fmt.Println("转换错误")
         }
     }


  • 这里使用strconv.Atoi函数将字符串str转换为int类型。该函数返回两个值,一个是转换后的整数,另一个是可能出现的错误。如果转换成功,errnil;如果转换失败,err不为nil,可以根据err的值来判断转换是否成功。
  • 数值转字符串:可以使用strconv.Itoa函数将整数转换为字符串。


package main
     
     import (
         "fmt"
         "strconv"
     )
     
     func main() {
         num := 123
         str := strconv.Itoa(num)
         fmt.Println(str)
     }


  • 对于其他数值类型(如float)转字符串,有strconv.FormatFloat函数。例如:


package main
     
     import (
         "fmt"
         "strconv"
     )
     
     func main() {
         num := 3.14159
         str := strconv.FormatFloat(num, 'f', 2, 64)
         fmt.Println(str)
     }


  • 这里FormatFloat函数的参数依次是要转换的浮点数、格式('f'表示普通格式)、精度(这里是保留 2 位小数)、位大小(64位)。


  1. 接口类型转换
  • Go 语言中的接口是一种抽象类型,它定义了一组方法。一个变量如果实现了接口定义的所有方法,就可以赋值给接口类型的变量。接口类型的变量可以在运行时持有不同类型的值,并且可以进行类型断言来获取其具体的类型。
  • 类型断言:类型断言用于提取接口中具体的值。它的语法是value, ok := interfaceVariable.(ConcreteType)


package main
     
     import "fmt"
     
     type Shape interface {
         Area() float64
     }
     
     type Circle struct {
         radius float64
     }
     
     func (c Circle) Area() float64 {
         return 3.14 * c.radius * c.radius
     }
     
     func main() {
         var s Shape = Circle{radius: 2.0}
         if c, ok := s.(Circle); ok {
             fmt.Println("这是一个圆,半径为", c.radius)
         }
     }


  • 在这个例子中,首先定义了一个接口Shape和一个实现了该接口的结构体Circle。然后创建了一个接口类型的变量s,并将一个Circle结构体赋值给它。通过类型断言c, ok := s.(Circle),如果s实际上是一个Circle类型,那么oktrue,并且c就是Circle类型的值,可以通过c来访问Circle结构体的成员。
  • 类型转换(类型开关):类型开关是一种更方便的处理接口类型转换的方式,特别是当接口可能包含多种类型的值时。


package main
     
     import "fmt"
     
     type Animal interface {
         Speak() string
     }
     
     type Dog struct{}
     
     func (d Dog) Speak() string {
         return "汪汪!"
     }
     
     type Cat struct{}
     
     func (c Cat) Speak() string {
         return "喵喵!"
     }
     
     func main() {
         animals := []Animal{Dog{}, Cat{}}
         for _, animal := range animals {
             switch a := animal.(type) {
             case Dog:
                 fmt.Println("这是一只狗,它说:", a.Speak())
             case Cat:
                 fmt.Println("这是一只猫,它说:", a.Speak())
             }
         }
     }


  • 这里定义了一个接口Animal和两个实现该接口的结构体DogCat。在main函数中,创建了一个包含DogCat的切片。通过类型开关switch a := animal.(type)来判断每个元素的具体类型,然后根据不同的类型进行相应的处理。


  1. 指针类型转换
  • 在 Go 语言中,指针类型之间也可以进行转换,但需要注意安全性。如果两个指针类型指向的底层数据类型是兼容的,那么可以进行转换。
  • 例如,将*int类型转换为*float64类型(假设底层数据类型是兼容的,这里只是示例实际情况可能需要更复杂的处理)。


package main
   
   import "fmt"
   
   func main() {
       var a int = 10
       var pInt *int = &a
       var pFloat *float64 = (*float64)(pInt)
       fmt.Println(*pFloat) 
   }


  • 这种转换可能会导致一些意外的结果,因为intfloat64在内存中的表示是不同的。在实际应用中,指针类型转换通常用于在自定义数据结构或者需要对内存进行底层操作的场景中,并且要确保转换的合理性和安全性。例如,在一些与 C 语言交互的 Go 程序中,可能需要进行指针类型的转换来正确地处理数据。
相关文章
|
Go
Golang 语言极简类型转换库 cast
Golang 语言极简类型转换库 cast
66 0
|
安全 Go
Golang:cast安全且易用的类型转换工具
Golang:cast安全且易用的类型转换工具
146 0
|
Java Linux Go
知识分享之Golang——常用的类型转换int、string、float互相转换
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
190 0
知识分享之Golang——常用的类型转换int、string、float互相转换
|
存储 Go C++
Golang 类型断言 vs 类型转换
Golang 类型断言 vs 类型转换
261 0
Golang 类型断言 vs 类型转换
|
Go
Golang学习之路(七):Golang类型转换
Golang学习之路(七):Golang类型转换
162 0
Golang类型转换
类型转换 1、int转string strconv.Itoa(i) 2、string转int i, err = strconv.Atoi(s) 或者 i, err = ParseInt(s, 10, 0) 3、string转float f, err = P...
875 0
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
144 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
72 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
119 3
Golang语言之gRPC程序设计示例