【愚公系列】2022年08月 Go教学课程 036-类型断言
Go 类型 2022 系列 课程 愚公 教学 08
2023-06-13 09:13:00 时间
文章目录
一、类型断言
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)
}
}
相关文章
- mysql截取中文字符_mysql截取字符串函数-Go语言中文社区
- 让你最快上手 go 的 pprof 性能分析大杀器
- Go学习 该如何入门
- Go 单测入门篇:Golang 单元测试基本使用
- Go 面向对象编程篇(一):类型系统概述
- [go-kratos-1]Golang微服务框架kratos安装和使用
- Go 高性能系列教程之五:内存和垃圾回收
- Go实战 | 记一次降低30%的CPU使用率的优化
- 2022-12-29:nsq是go语言写的消息队列。请问k3s部署nsq,yaml如何写?
- GO语言——IO项目
- go的数据类型-复合数据类型-slice(二)
- Go实战–也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)详解大数据
- Go语言圣经–接口约定习题2详解编程语言
- 使用Go语言来操作Oracle数据库(go语言oracle)
- Go语言数据库(Database)相关操作
- Go语言嵌入类型
- Go语言strconv包:字符串和数值类型的相互转换
- Go语言使用图像包制作GIF动画
- 使用 Go 语言的三个原因
- Go 1.12 正式版发布,初步支持 TLS 1.3
- 硬核观察 | Python 之父对 Rust、Go、Julia 和 TypeScript 的看法
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 部署Linux下快速部署Go环境(go环境linux)
- 语言结合SQL Server,Go谱写新篇章(sqlserver的go)
- SQL Server快速上手GO!(sqlserver go)
- 便捷使用Go编程连接Redis(go连接redis)
- Go语言操作Oracle数据库技术实践(go操作oracle)
- 语言Oracle中发挥神奇作用的Go语言(oracle中有go)
- Go语言的方法接受者类型用值类型还是指针类型?
- GO语言类型转换和类型断言实例分析