package main
import (
"fmt"
)
type Point struct {
x int
y int
}
func main() {
var a interface{}
var point Point = Point{1, 2}
a = point //oK
// 如何将 a 赋给一个Point变量
var b Point
// b = a //不可以
// b = a.(Point) //可以,类型断言
b = a.(Point)
fmt.Println(b) //{1 2} //类型断言的其它案例
// var x interface{}
// var b2 float32 = 1.1
// x = b2 //空接口,可以接收任意类型
// // x=>float32 [使用类型断言]
// y := x.(float32) //这里必须是float32
// fmt.Printf("y 的类型是 %T 值是=%v", y, y) //y 的类型是 float32 值是=1.1 //类型断言(带检测的)
var x interface{}
var b2 float32 = 2.1
x = b2 //空接口,可以接收任意类型
// x=>float32 [使用类型断言]
//类型断言(带检测的)
if y, ok := x.(float32); ok { //golang支持在if中,直接定义一个变量
fmt.Println("convert success") //convert success
fmt.Printf("y 的类型是 %T 值是=%v", y, y) //y 的类型是 float32 值是=2.1继续执行...
} else {
fmt.Println("convert fail")
}
fmt.Println("继续执行...") }
package main
import (
"fmt"
) //声明/定义一个接口
type Usb interface {
//声明了两个没有实现的方法
Start()
Stop()
} type Phone struct {
name string
} //让Phone实现Usb接口的方法
func (p Phone) Start() {
fmt.Println("手机开始工作。。。")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作。。。")
}
func (p Phone) Call() { //在接口里面是没有的,是独有的
fmt.Println("手机 在打电话..")
} type Camera struct {
name string
}
//让Camera实现Usb接口的方法
func (c Camera) Start() {
fmt.Println("相机开始工作。。。")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作。。。")
} type Computer struct { }
func (computer Computer) Working(usb Usb) {
usb.Start()
//如果usb是指向Phone结构体变量(多态),则还需要调用Call方法
//类型断言
if phone, ok := usb.(Phone); ok {
phone.Call()
}
usb.Stop()
} func main() {
//定义一个Usb接口数组,可以存放Phone和Camera的结构体变量
//这里就体现出多态数组
//一个数组只能放一个数据类型,这里放了Phone类型,Camera类型
var usbArr [3]Usb //数组存的是实现了usb结构体的变量
usbArr[0] = Phone{"vivo"}
usbArr[1] = Phone{"小米"}
usbArr[2] = Camera{"尼康"} //遍历usbArr
//Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量,
//除了调用Usb 接口声明的方法外,还需要调用Phone 特有方法 call. =》类型断言
var computer Computer
for _, v := range usbArr{
computer.Working(v)
fmt.Println()
}
//fmt.Println(usbArr)
}
package main

import (
"fmt"
) //定义Student类型
type Student struct {
} //编写一个函数,可以判断输入的参数是什么类型
func TypeJudge(items ... interface{}) {
for index, x := range items {
switch x.(type) {
case bool:
fmt.Printf("第%v个参数是 bool 类型,值是%v\n", index, x)
case float32:
fmt.Printf("第%v个参数是 float32 类型,值是%v\n", index, x)
case float64:
fmt.Printf("第%v个参数是 float64 类型,值是%v\n", index, x)
case int, int32, int64:
fmt.Printf("第%v个参数是 整数 类型,值是%v\n", index, x)
case string:
fmt.Printf("第%v个参数是 string 类型,值是%v\n", index, x)
case Student:
fmt.Printf("第%v个参数是 Student 类型,值是%v\n", index, x)
case *Student:
fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", index, x)
default:
fmt.Printf("第%v个参数是 类型 不确定,值是%v\n", index, x)
}
}
} func main() { var n1 float32 = 1.1
var n2 float64 = 2.3
var n3 int32 = 30
var name string = "tom"
address := "北京"
n4 := 300 stu1 := Student{}
stu2 := &Student{} TypeJudge(n1, n2, n3, name, address, n4, stu1, stu2)
//第0个参数是 float32 类型,值是1.1
//第1个参数是 float64 类型,值是2.3
//第2个参数是 整数 类型,值是30
//第3个参数是 string 类型,值是tom
//第4个参数是 string 类型,值是北京
//第5个参数是 整数 类型,值是300
//第6个参数是 Student 类型,值是{}
//第7个参数是 *Student 类型,值是&{}
}

Go类型断言的更多相关文章

  1. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  2. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

  3. golang 类型断言的学习

    在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...

  4. golang类型断言

    一.介绍 类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言 例子: package main import "fmt" func main(){ ...

  5. [Go] golang类型断言

    类型断言有点像向下转型,接口类型转到具体的实现实例类型上类型断言是一个使用在接口值上的操作.语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型 package main ...

  6. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

  7. go语言之进阶篇通过switch实现类型断言

    1.通过switch实现类型断言 示例: package main import "fmt" type Student struct { name string id int } ...

  8. go语言之进阶篇通过if实现类型断言

    1.通过if实现类型断言 示例: package main import "fmt" type Student struct { name string id int } func ...

  9. Go语言的类型转换和类型断言

    https://my.oschina.net/chai2010/blog/161418 https://studygolang.com/articles/9335  类型转换.类型断言和类型切换 ht ...

  10. Go 的类型断言type assertion

    Go语言中的类型断言,语法上是这样的: x.(T) 其中,x是interface接口的表达式,T是类型,称为被断言类型. 补充一下,接口有接口值的概念,其包括动态类型和动态值两部分. 类型断言根据T的 ...

随机推荐

  1. STM32------SYSCLK

    重要的时钟:PLLCLK,  SYSCLK,  HCKL,   PCLK1,   PCLK2  之间的关系要弄清楚; 1.HSI:高速内部时钟信号 stm32单片机内带的时钟(8M频率)精度较差2.H ...

  2. echo -e 实现color output

    拓展: cp  简化: c'p  -rv   /data/project/test {.txt,_bak.txt}

  3. web自动化环境搭建(python+selenium+webdriver)

    本文档以谷歌浏览器为例,故自动化测试环境为下: 自动化工具为:selenium+webdriver 脚本语言为:Python3.X 浏览器:Chrome 系统环境:Win10 编译工具:Pycharm ...

  4. MP4文件格式分析及分割实现(附源码)

    MP4文件格式分析                   MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在“ISO/IEC 14496-14”标准文件中定义的,属于MPEG-4的 ...

  5. pandas 进行excel绘图

    python主流绘图工具:matplotlib ,seaborn,pandas ,openpyxl ,xslwriter openpyxl :首先说下这个官网的demo,看的有点懵,没有具体说明多个图 ...

  6. CSS-透明背景色兼容

    IE 不支持透明背景色 使用fileter div{ backgournd: #666; filter:alpha(opacity=50); -moz-opacity:0.5; opacity:0.5 ...

  7. luckyframe的一些坑

    建议使用idea运行 1.第一次运行访问http://localhost:8088/LuckyFrameServer 2.luckyframe提示“javax.net.ssl.SSLKeyExcept ...

  8. python正则匹配次数,贪婪和非贪婪

    贪婪模式  {m,n}表示匹配子串的次数>=m and <=n,再此分为内匹配次数尽可能的多 贪婪模式  {,n}表示 >=0 and <=n 贪婪模式  {m,} 表示> ...

  9. ASP.NET的 Razor引擎和JavaScript是一种什么关系

    Razor能做的JS大部分能做,不是全部.比如说,如果你用了Entity Frame一类的ORM的时候,Razor可以直接绑定数据库数据,但JS就不可能直接访问数据库——必须通过其他web servi ...

  10. bugku 管理员系统

    这一个是伪造ip X-FORWARDED-FOR:127.0.0.1 用到了XFF头 首先打开网站会发现一个登录界面 然后用开发者工具看一下 后台会发现一串用base64加密的密文 用base64解密 ...