写点什么

【愚公系列】2022 年 10 月 Go 教学课程 036- 类型断言

作者:愚公搬代码
  • 2022-10-22
    福建
  • 本文字数:1352 字

    阅读完需:约 4 分钟

一、类型断言

1,类型断言的定义

GO 中的类型断言用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。


类型断言的语法格式如下:


value, ok := x.(T)
复制代码


其中,x 表示一个接口的类型的实际值,T 表示一个具体的类型(也可为接口类型)。


该断言表达式会返回 value(x 的实际值)和 ok(x 的值是否等于 T 的类型),可根据该布尔值判断 x 是否为 T 类型:


  • 如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断言返回的结果是 x 的动态值,其类型是 T。

  • 如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,x 的动态值不会被提取,返回值是一个类型为 T 的接口值。

  • 无论 T 是什么类型,如果 x 是 nil 接口值,类型断言都会失败。

2.类型断言的使用

package main
import "fmt"
func main() { var i interface{} i="abc" value,ok:=i.(int) if ok{ fmt.Println(value+10) }else{ fmt.Println("类型推断错误") }
}
复制代码


3.案例

package main
import "fmt"
// 加法类type Add struct { Object}
func (a *Add) GetResult() int { // 方法的实现要和接口中方法的声明保持一致 return a.numA + a.numB}func (a *Add) SetData(data ...interface{}) bool { // 1: 对数据的个数进行校验。 var b bool = true if len(data) > 2 { fmt.Println("参数个数错误!!") b = false } value, ok := data[0].(int) if !ok { fmt.Println("第一个数类型错误") b = false } value1, ok1 := data[1].(int) if !ok1 { fmt.Println("第二个数据类型错误") b = false } a.numA = value a.numB = value1 // 2: 类型进行校验。 return b}
// 减法类type Sub struct { Object}
func (s *Sub) SetData(data ...interface{}) bool { // 1: 对数据的个数进行校验。 var b bool = true if len(data) > 2 { fmt.Println("参数个数错误!!") b = false } value, ok := data[0].(int) if !ok { fmt.Println("第一个数类型错误") b = false } value1, ok1 := data[1].(int) if !ok1 { fmt.Println("第二个数据类型错误") b = false } s.numA = value s.numB = value1 // 2: 类型进行校验。 return b}
func (s *Sub) GetResult() int { return s.numA - s.numB}
type Object struct { numA int numB int}type Resulter interface { GetResult() int SetData(data ...interface{}) bool // 完成参数运算的数据的类型校验。}
// 对象问题// 1: 定义一个新的类type OperatorFactory struct {}
// 2: 创建一个方法,在该方法中完成对象的创建func (o *OperatorFactory) CreateOperator(op string) Resulter { switch op { case "+": add := new(Add) return add case "-": sub := new(Sub) return sub
default: return nil }}func OperatorWho(h Resulter) int { return h.GetResult()}func main() { var operator OperatorFactory obj := operator.CreateOperator("-") b := obj.SetData(30, 10) if b { num := OperatorWho(obj) fmt.Println(num) }
}
复制代码



发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-03-01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年10月 Go教学课程 036-类型断言_10月月更_愚公搬代码_InfoQ写作社区