将一个值从一种类型转换到另一种类型,便发生了类型转换。静态语言如c/c++,Java提供了隐性的类型转换,但对于golang这种强类型系统则不一样,golang并不支持自动类型转换或者隐性类型转换。

在go可以分为断言、强制、显式类型转换。

通常说的类型转换是指断言,强制一般不会用到,显式是基本的类型转换

断言

断言通过判断接口x是否不是nil且为T类型

var s = x.(T)

具体而言,在T不为接口时,要求x的动态类型就是T,并且T必须实现了x接口;否则类型断言无效,因为x不可能储存类型T的值

动态类型:接口类型可以包含对实现接口的任何类型的实例的引用(接口具有所谓的动态类型)

type I interface{ F() }type S struct{}
func (S) F() { }type T struct{}
func (T) F() { }// 此时静态类型为接口I
var x I
// 此时动态类型为结构体S
x = S{}
// 重赋予x动态类型为结构体T
x = T{}

在T为接口时,x必须实现接口T

断言失败会触发panic,当然也可以s,ok:=x.(T),使用ok表示是否成功。

// 接口x转换为非接口类型   var x interface{} = 1y:=x.(int)// 接口x转换为接口类型
type TypeAssertA interface {typeAssertA()
}type TypeAssertB interface {typeAssertB()
}type ta struct {}func (t ta) typeAssertA() {}func (t ta) typeAssertB() {}
// ta结构既实现了TypeAssertA又实现TypeAssertB,因此可以在两种接口类型之间相互转换var x TypeAssertA = ta{}y:=x.(TypeAssertB)

switch断言

switch判断具体值类型,而在case中匹配具体类型。也可以i:=x.(type)直接得到匹配类型的值

强制

通过unsafe等进行强制类型转换

比如将floag64类型转换为uint64类型,可能值表现不同,但内存二进制储存却是一样的

var f float64
u:= *(*uint64)(unsafe.Pointer(&f))

还可以用来进行接口类型检测

// 检查contextImpl是否实现了context接口
var c Context=(*ContextImpl)(nil)

显式

将一个类型表达式转换为另一个

var s =T(x)

在碰到*<-或者func开头的,最好使用括号以防止误用

*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to *Point
<-chan int(c)    // same as <-(chan int(c))
(<-chan int)(c)  // c is converted to <-chan int
func()(x)        // function signature func() x
(func())(x)      // x is converted to func()
(func() int)(x)  // x is converted to func() int
func() int(x)    // x is converted to func() int (unambiguous)

一个非常量x可以在以下情况下转换为类型T

  • x可以赋值为T
  • 忽略struct标签,x类型与T具有相同的基础类型
  • 忽略 struct 标记 x 的类型和 T 是未定义类型的指针类型,并且它们的指针基类型具有相同的基础类型。
  • x 的类型和 T 都是整数或浮点类型。
  • x 的类型和 T 都是复数类型。
  • x 的类型是整数或 [] byte 或 [] rune,并且 T 是字符串类型。
    或者x 的类型是字符串,T 类型是 [] byte 或 [] rune。

注意可以赋值为指的是(V为x类型):

  • V等于T
  • V和T是具有相同元素类型的通道类型,V是双向channel,且V或T中至少有一个不是以type命名的类型。
  • T是接口类型,但不是类型参数,x实现了T。
  • x是预先声明的标识符nil, T是指针、函数、切片、映射、通道或接口类型,但不是类型参数。
  • x是一个没有类型的常量,可以用类型T的值表示。

此外,如果x的类型V或T是类型参数,则在下列条件之一适用时,x可赋值给类型T的变量:

  • x是预先声明的标识符nil, T是一个类型参数,x可以赋值给T的类型集中的每个类型。
  • V不是一个命名类型,T是一个类型参数,x可以赋值给T的类型集中的每个类型。
  • V是一个类型参数,T不是一个命名类型,V的类型集中的每个类型的值都可以赋值给T。

Ref

  1. https://learnku.com/articles/42797
  2. https://golang.google.cn/ref/spec#Type_assertions
  3. https://www.digitalocean.com/community/tutorials/how-to-convert-data-types-in-go
  4. https://golang.org/ref/spec#Conversions
  5. https://stackoverflow.com/questions/33337403/what-does-dynamic-type-mean-in-a-go-interface
  6. https://go.dev/ref/spec#Assignability

Golang 类型转换相关推荐

  1. golang: 类型转换和类型断言

    类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编译器不会 ...

  2. Golang类型转换

    类型转换 1.int转string strconv.Itoa(i) 2.string转int i, err = strconv.Atoi(s) 或者 i, err = ParseInt(s, 10, ...

  3. Go各种类型转换及函数的高级用法

    golang是强类型语言,在应用过程中类型转换基本都会用到.下面整理一下常用的类型转换,会持续更新. 整形转字符串 fmt.Println(strconv.Itoa(100)) 该方法的源码是: // ...

  4. go语言的类型转换 整型转字符串 字符串转整型

    golang是强类型语言,在应用过程中类型转换基本都会用到.下面整理一下常用的类型转换,会持续更新. 整形转字符串 fmt.Println(strconv.Itoa(100)) 该方法的源码是: // ...

  5. Golang Study

    安装 下载第三方包 - Golang中国 IDEA IDEA写Golang的一些操作/技巧 - 冥灭 - SegmentFault 亲测可用!!!golang如何在idea中保存时自动进行代码格式化 ...

  6. java开发checklist,Java API设计CheckList

    API设计原则:正确.好名.易用.易学.够快.够小.但我们从来不缺原则,〜〜〜 Interface 1.The Importance of Being Use Case Oriented,一个接口应当 ...

  7. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  8. android悬浮按钮阴影,浅谈FloatingActionButton(悬浮按钮)

    一.介绍 这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性 android.support.design.widget.FloatingActionButt ...

  9. golang interface 类型转换_无符号Golang程序逆向方法解析

    在去年的inctf2018中,出现了一道Go语言编写的进程通信逆向题,无论是从题目整体设计还是解题思路上来说都独树一帜,自己在解题过程中遇到了很多问题,但我这不打算做过多探讨,网上也有大佬的解题过程, ...

最新文章

  1. Python最抢手、Go最有前途,7000位程序员揭秘2019软件开发现状
  2. 2019年安徽高考最高分出炉:文科681分 理科710分
  3. wxWidgets:wxStringBufferLength类用法
  4. 【ES6(2015)】解构赋值Desctructuring
  5. Java架构师面试题系列之Mybatis面试专题(36题,含详细答案解析)
  6. 5G手机还没普及 LG电子就已着手研发6G
  7. lsof 一切皆文件
  8. 计算机简单进制转换题目,计算机数制转换题!(1011011)2 =( )10=( )16 =( )8(110111101)2 =( )10=(...
  9. java电商ERP源码 跨境电商ERP源码 ERP源码
  10. 海纳百川下载器(道客巴巴免费下载器)程序已停止工作解决方法
  11. 关于选课系统的的界面设计、类图设计、数据库设计。
  12. 计算机的管理软件有哪些,电脑里有很多文件,很乱但是都有用,有什么管理软件值得推荐?...
  13. 根号分治 + 入门题目
  14. 区块链黑暗森林自救手册
  15. 用html写一个计时器
  16. Android图片上传的两种方式
  17. python画猪猪侠_猪猪侠简笔画怎么画
  18. SLAM--Geometric jacobian of UR series.
  19. A095_day01_微信小程序入门与组件
  20. OPPO广告联盟战略升级,全面提升开发者变现效率

热门文章

  1. 基于awk的nginx日志分析
  2. 来吧,是时候升级您的领英技术档案了
  3. 精选IBM 校园招聘职位信息
  4. docker安装启动
  5. mit6.824 2022 lab2
  6. 第三方苹果开发库之ASIHTTPRequest
  7. php worker是什么意思,php-fpm中worker进程执行流程是什么
  8. 为什么我们要努力的赚钱?
  9. 性能优化——FBX设置优化Model面板部分
  10. SpringBoot项目配置多个RabbitMQ解决方案