2022/02/09//今天就这么多吧,顶不住了,睡觉保狗命!package mainimport "fmt"/*断言
*/type Point struct {x inty int
}type nilInterface interface{}func main() {var point Point = Point{1, 2}var x nilInterface/*空接口还可以直接用var x interface{}*/x = point //空接口可以接收任意类型的值//如果想知道 x 是不是nilInterface类型,需要用到断言y := x.(nilInterface) //如果转换成功就成功,不成功就报错fmt.Println(y)        // output: {1 2}/*如何使用带检测的断言,如果转换成功,就继续运行,如果转换失败,就不转换继续运行下面的代码*/p, ok := x.(int)if ok {fmt.Println("转换成功")fmt.Printf("p的类型是 %T, 值是%v\n", p, p)} else {fmt.Println("转换失败")}/*   上面的判断等价于if p,ok := x.(int); ok {fmt.Println("转换成功")fmt.Printf("p的类型是 %T, 值是%v\n", p, p)}   else {fmt.Println("转换失败")}*/fmt.Println("转换失败后依旧不影响后面的代码运行")z := x.(int)fmt.Println(z) // output: panic: interface conversion: main.nilInterface is main.Point, not int
}
package main/*来一个类型断言的经典案例1
*/
import "fmt"/*问题来了,如果Phone定义有一个Call()方法,但是Camaro并没有这个方法那么我们在Computer中调用的时候如何判断传入的Usb接口是Phone类型还是Camaro类型呢需要使用断言,详情看代码
*///声明一个接口
type Usb interface {//声明了两个没有实现的方法start()stop()
}type Phone struct {
}//让phone实现USB接口的方法
func (p Phone) start() {fmt.Println("手机开始工作...")
}func (p Phone) stop() {fmt.Println("手机停止工作...")
}func (p Phone) Call() {fmt.Println("手机打电话...")
}type Camaro struct {
}//让相机实现USB接口的方法
func (c Camaro) start() {fmt.Println("相机开始工作...")
}func (c Camaro) stop() {fmt.Println("相机停止工作...")
}//计算机
type Computer struct {
}//编写一个方法Working方法,接收一个usb接口类型变量
//只要是实现了USB接口(就是指实现了Usb接口声明的所有方法)
func (c Computer) Working(usb Usb) {//通过USB接口变量来调用start和stop方法//在这里判断,如果传入的是Phone,也要调用Call()方法usb.start()/*如果我们这里直接调用usb.Call()方法,万一传入的是Camaro就没有这个方法,不是要panic了么*/if p, ok := usb.(Phone); ok {p.Call()}usb.stop()
}func main() {//测试var computer Computer = Computer{}var phone Phone = Phone{}var camaro Camaro = Camaro{}//关键点computer.Working(phone)computer.Working(camaro)}
package mainimport "fmt"/*来一个类型断言的经典案例2写一个函数,循环判断传入参数的类型
*/type MyStruct struct {
}//...表示函数TypeJudge可以接收任意多个实参
//interface{}表示函数TypeJudge可以接收任意类型的实参
//Items ...interface{} 表示函数TypeJudge可以接收任意多个任意类型的实参
func TypeJudge(Items ...interface{}) {for i, x := range Items {switch x.(type) { //这里type是一个关键字,固定写法case bool:fmt.Printf("param #%d is a bool 值是%v\n", i, x)case float64:fmt.Printf("param #%d is a float64 值是%v\n", i, x)case int, int32, int64:fmt.Printf("param #%d is a int 值是%v\n", i, x)case string:fmt.Printf("param #%d is a string 值是%v\n", i, x)case nil:fmt.Printf("param #%d is a nil 值是%v\n", i, x)case MyStruct:fmt.Printf("param #%d is a nil 值是%v\n", i, x)case *MyStruct:fmt.Printf("param #%d is a nil 值是%v\n", i, x)default:fmt.Println("不知道这是个什么类型")}}
}func main() {// var n1 float32 = 1.1// var n2 float64 = 2.2// var n3 int32 = 1// var n4 string = "smx"// var n5 bool = true//还可以判断自定义类型var myS MyStructvar myS2 *MyStruct //指针为空,nilvar myS3 *MyStruct = &MyStruct{}TypeJudge(6, "ert", 1.2, true, myS, myS2, myS3)
}

GO语言学习之路18相关推荐

  1. Go语言学习之路(二)

    Go语言学习之路(二) 面对对象编程思想 抽象 封装 继承 接口 文件 命令行参数 Json 序列化 反序列化(unmarshal) 单元测试 Redis Redis简介 Redis基本使用 Go连接 ...

  2. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  3. C语言-学习之路-01

    C语言学习之路-01 目录 关键字 数据类型 常量 变量 声明和定义 进制 sizeof关键字 整型:int short.int.long.long long 字符型:char ASCII对照表 转义 ...

  4. Go语言学习之路——Go语言简介

    本文首发于我的博客 很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东 ...

  5. C语言学习之路--计算机系统组成以及工作原理,进制之间的转换和机器数及其表示范围

    目录 一.前言 二.计算机系统组成以及工作原理简介 1.硬件系统基本组成原理及工作原理 2.硬件各部分详解 1.运算器 2.控制器 CPU 3.存储器 1.内存储器 2.外存储器 3.拓展 4.存储器 ...

  6. C语言学习之路--函数,从知识到实战

    目录 一.前言 二.函数是什么? 三.C语言中函数的分类 1.库函数 1.为什么会有库函数? 2.如何学习库函数? 3.学习库函数举例 1.strcpy 2.memset 3.库函数学习工具总结 2. ...

  7. GO语言学习之路13

    2022/02/04package mainimport ("fmt""sort" )/*map是key-value数据结构,又称为字段或者关联数组,类似其他编 ...

  8. GO语言学习之路10

    2022/02/01package mainimport ("fmt""strconv""strings" )//1.字符串中常用的系统函数 ...

  9. C语言学习之路--C语言中的格式输出

    一.前言 在我们初学C语言的过程中,会有一些类似%d之类的格式输出,我在此做个汇总,供大家学习. 二.分类 1.%u 十进制无符号整数. 2.%f 表示输出浮点数. 可以通过输出格式说明符来指定精确到 ...

最新文章

  1. jquery操作select(增加,删除,清空)
  2. oracle:ORA-01940无法删除当前已连接用户的解决方案
  3. Android架构组件LiveData+ViewModel
  4. ASP.NET MVC学习资料 新增几个开源项目
  5. CopyFile and Directory By channel
  6. mat-form-field must contain a MatFormFieldControl错误的解决方法
  7. vue2中的keep-alive使用总结及注意事项
  8. nohup xxx 后台进程关闭,可以这样避免
  9. Python 标准库 —— string
  10. ALSA播放时杂音问题
  11. [推荐]一个 1kb 的image placeholder的js库
  12. 卡分区 shell脚本_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息
  13. 《赖氏经典英语语法》练习三 关系词
  14. appium 切换上下文的时候报错
  15. 【算法导论】 二叉搜索树、AVL树、和红黑树
  16. 哪个一键重装电脑系统工具好用些?
  17. Bilateral Multi-Perspective Matching for Natural Language Sentences---读书笔记
  18. 我是个28岁的IT,我现在慌得一比
  19. 最全大数据学习资源整理
  20. diskpart命令创建GPT磁盘分区

热门文章

  1. linux上设置tomcat下web项目只需要ip地址访问省略端口和项目名称
  2. 求合作开发伙伴 .NET 中高级工程师 1-2名
  3. 大数据之Linux早课9.11
  4. css flexbox水平垂直
  5. Codeforces Round #168 (Div. 2)
  6. Q102:光线追踪场景(3)——Two Horses
  7. php 百科源码,php源码是什么意思
  8. 第一章 计算机网络概述[知识点+课后习题+练习题]
  9. 5.4(将英里转化位千米)
  10. 大数据分析常见的犯错问题