Go 之 interface接口理解
时间:2022-07-25
本文章向大家介绍Go 之 interface接口理解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
go语言并没有面向对象的相关概念,go语言提到的接口和java、c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承、子类、implements关键词。go语言通过隐性的方式实现了接口功能,相对比较灵活。
interface是go语言的一大特性,主要有以下几个特点:
- interface 是方法或行为声明的集合
- interface接口方式实现比较隐性,任何类型的对象实现interface所包含的全部方法,则表明该类型实现了该接口。
- interface还可以作为一中通用的类型,其他类型变量可以给interface声明的变量赋值。
- interface 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。
下面是一些代码示例
接口实现
package main
import "fmt"
type Animal interface {
GetAge() int32
GetType() string
}
type Dog struct {
Age int32
Type string
}
func (a *Dog) GetAge() int32 {
return a.Age
}
func (a *Dog) GetType() string {
return a.Type
}
func main() {
animal := &Dog{Age: 20, Type: "DOG"}
fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())
}
interface作为通用类型
package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Amount float64
}
func main() {
var i interface{}
i = "string"
fmt.Println(i)
i = 1
fmt.Println(i)
i = User{Id: 2}
//i.(User).Id = 15 //运行此处会报错,在函数中修改interface表示的结构体的成员变量的值,编译时遇到这个编译错误,cannot assign to i.(User).Id
fmt.Println(i.(User).Id)
}
interface接口查询
接口查询,在一个接口变量中,查询所赋值的对象有没有实现其他接口所有的方法的过程,就是查询接口。即接口A实现了接口B中所有的方法,那么通过查询赋值A可以转化为B。
代码示例
package main
import "fmt"
type Animal interface {
GetAge() int32
GetType() string
}
type AnimalB interface {
GetAge() int32
}
type Dog struct {
Age int32
Type string
}
func (a *Dog) GetAge() int32 {
return a.Age
}
func (a *Dog) GetType() string {
return a.Type
}
func main() {
var animal Animal = &Dog{Age: 20, Type: "DOG"}
fmt.Printf("%s max age is: %d", animal.GetType(), animal.GetAge())
var animalb AnimalB = &Dog{Age: 20, Type: "DOG"}
fmt.Printf("max age is: %d", animalb.GetAge())
//这里实现了animalb 转化Animal接口
val, ok := animalb.(Animal)
if !ok {
fmt.Println("ok")
} else {
fmt.Printf("%s max age is: %d", val.GetType(), val.GetAge())
}
}
接口转化很简单
val, ok := animalb.(Animal)
注意,animalb 只有AnimalB所包含的方法GetAge()。
如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A,反之则不行。
接口类型查询
只能对interface{}类型的变量使用类型查询
示例
package main
import "fmt"
type Animal interface {
GetAge() int32
GetType() string
}
type AnimalB interface {
GetAge() int32
}
type Dog struct {
Age int32
Type string
}
func (a *Dog) GetAge() int32 {
return a.Age
}
func (a *Dog) GetType() string {
return a.Type
}
func main() {
var i interface{}
//i = "ok"
//方法一
val, ok := i.(Animal)
if !ok {
fmt.Println("no")
} else {
fmt.Println(val.GetAge())
}
// 方法二
switch val := i.(type) {
case string:
fmt.Println(val)
case int:
fmt.Println(val)
default:
fmt.Println(val)
}
// 方法三 通过反射
typename := reflect.TypeOf(i)
fmt.Println(typename)
}
interface默认nil所以查出是nil,如果给i赋值一个字符型值(去掉i = "ok"前面的注释),则返回
no ok string
参考:
https://blog.csdn.net/hzwy23/...
https://www.cnblogs.com/zhang...
- fastText、TextCNN、TextRNN…这套NLP文本分类深度学习方法库供你选择
- nfc开发
- N-CryptoAsset投资组合 | 使用PCA识别高度相关的加密货币(最近听说某币很疯狂哦!)
- 仿刮刮乐刮奖效果
- Spacebuilder在Mono上运行修改备忘
- maven配置详解
- 这一新的可视化方法教你优雅地探索相关性
- LSTM Networks在股票市场上的探究
- MSBuild的简单介绍与使用
- actionbar详解(二)
- actionbar完全解析(一)
- android galley实现画廊效果
- RavenDB:基于Windows/.NET平台的NoSQL数据库
- 神经网络算法交易:波动预测与定制损失函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法