Go Interface 合法验证

简介: - 值方法集和接口匹配 - 给接口变量赋值的不管是值还是指针对象,都ok,因为都包含值方法集- 指针方法集和接口匹配 - 只能将指针对象赋值给接口变量,因为只有指针方法集和接口匹配 - 如果将值对象赋值给接口变量,会在编译期报错(会触发接口合理性检查机制)

接口实现判断依据

  • 值方法集和接口匹配
    • 给接口变量赋值的不管是值还是指针对象,都ok,因为都包含值方法集
  • 指针方法集和接口匹配
    • 只能将指针对象赋值给接口变量,因为只有指针方法集和接口匹配
    • 如果将值对象赋值给接口变量,会在编译期报错(会触发接口合理性检查机制)

接口绑定

type Annimaler interface {
   
    Name() string
}

type Dog struct {
   }

func (d *Dog) Name() string {
   
    return "二哈"
}

func main()  {
   
    var i Annimaler
    i = &Dog{
   }
    i = (*Dog)(nil)
    i = new(Dog)
    // i = Handle{} // 无法编译通过,因为 i 是指针类型,Handle{} 不是指针类型

    // 调用接口方法
    fmt.Println(i.Name())
}

基于以上的代码,我们大致可以写出 go interface 合理性验证的代码如下:

var _ Annimaler = &Dog{
   }
var _ Annimaler = (*Dog)(nil)

代码解释

赋值的右边应该是断言类型的零值,也就是说 Dog 类型的零值等于Annimaler类型的零值。
如果是指针类型(如 *Annimaler)、切片和映射,这是 nil
如果是结构类型,这是空结构。

(*Dog)(nil) 是类型断言,就是把变量用 nil 代替,把 nil 转换成一个 Dog 类型的空指针后赋值给 Annimaler

接收器 (receiver) 与接口,接口与具体方法集的匹配

一个类型可以有值接收器方法集和指针接收器方法集

使用值接收器的方法既可以通过值调用,也可以通过指针调用。带指针接收器的方法只能通过指针或 addressable values调用(其实和值调用类似)。

如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是对象的副本,不影响调用者;如果方法的接收者是指针类型,则调用者修改的是指针指向的对象本身。

通常我们使用指针作为方法的接收者的理由:

  • 使用指针方法能够修改接收者指向的值。
  • 可以避免在每次调用方法时复制该值,在值的类型为大型结构体时,这样做会更加高效。

在该代码中:

i = &Dog{
   }
fmt.Println(i.Name())

编译是可以通过的,这就是通过 addressable values 调用的。

参考资料

相关文章
|
人工智能 数据可视化 编译器
Go interface实现分析
本文深入探讨了Go语言中接口的定义、实现及性能影响。接口作为一种“约定”,包含方法签名集合,无需依赖具体类型即可调用方法,隐藏了内部实现细节。文章分析了接口的两种实现方式(iface和eface)、按值与按指针实现的区别,以及nil接口与普通nil的区别。同时,通过反汇编代码对比了接口动态调用与类型直接调用的性能差异,指出接口调用存在内存逃逸和无法内联的问题。最后总结了接口的优势与局限性,强调在实际开发中需根据场景合理选择是否使用接口。
312 13
|
数据采集 网络协议 测试技术
使用Go Validator在Go应用中有效验证数据
使用Go Validator在Go应用中有效验证数据
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
489 12
|
人工智能 Go
go validator 值为 0 required 验证
go validator 值为 0 required 验证
176 6
Go - struct{} 实现 interface{}
Go - struct{} 实现 interface{}
174 9
|
JSON 人工智能 编译器
Go json 能否解码到一个 interface 类型的值
Go json 能否解码到一个 interface 类型的值
175 1
|
数据采集 网络协议 测试技术
使用Go Validator在Go应用中有效验证数据
使用Go Validator在Go应用中有效验证数据
|
存储 前端开发 中间件
Go Web 开发 Demo【用户登录、注册、验证】(3)
Go Web 开发 Demo【用户登录、注册、验证】
|
前端开发 数据库连接 Go
Go Web 开发 Demo【用户登录、注册、验证】(1)
Go Web 开发 Demo【用户登录、注册、验证】

热门文章

最新文章