首页 > 其他分享 >GoLang:接口

GoLang:接口

时间:2023-08-22 10:36:12浏览次数:32  
标签:name fmt 接口 GoLang func Println type

学习自:Go教程119页

1、说明

接口是为了定义某些标准,接口本身不需要实现这些标准

2、定义

接口中不能有任何数据字段,只能有函数声明

type 接口名称 interface{
    函数声明
}

 

接口中嵌入另一个接口

但是嵌入的接口中方法不能重名,把自己嵌入自己

3、例子

1)常规用法

定义一个接口

type usber interface{
    start()
    stop()
}

定义两个将要使用该接口的结构体

type Computer struct{
    name string
    model string
}
type Phone struct{
    name string
    model string
}

实现接口方法(和实现正常方法的写法相同,区别在于要为每种结构体各写一遍)

//为Computer实现接口方法
func (cm Computer)start(){
    fmt.Println("启动电脑")
}
func (cm Computer)stop(){
    fmt.Println("关闭电脑")
}

//为Phone实现接口方法
func (p Phone)start(){
    fmt.Println("启动手机")
}
func (p Phone)stop(){
    fmt.Println("关闭手机")
}

使用接口

//在另一个函数中使用接口中的方法
func working(u usber){
    u.start()
    u.stop()
}

func main(){
    cm := Computer{"戴尔","F1234"}
    working(cm)//启动电脑,关闭电脑
    
    p := Phone{"华为","M10"}
    working(p)//启动手机,关闭手机
}

实现接口的结构体就像Java语言中实现接口的子类一样,后续使用时用结构体代替参数中的接口进行具体操作,则和运行时多态类似。

//work定义
func working(u user){
    ...
}

//具体使用
cm:=Computer{...}
p:=Phone{...}
working(cm)
working(p)

只有实现了接口中的所有方法,才算实现了接口,才能用接口类型接收。如果只是实现了部分方法,则不能接收该类型。

2)定义接口变量,去接收实现了接口的结构体

type studier interface {
    read()
}
type Person struct{
    name string
    age int
}

func (p Person)read(){
    fmt.Println(p.name,"正在学习")
}
func main(){
    //定义接口变量
    var s studier
    //用接口变量接收实现了接口的结构体
    s = Person{"lnj",33}
}

用接口接收结构体后,只能进行整体访问不能进行单个内部数值修改,因为接口没有自己的属性:

fmt.Println(s) //正确
fmt.Println(s.name)//错误

要想访问结构体属性,必须将接口类型还原为原始类型:

方法①:类型断言 ok-idiom

if p,ok :=s.(Person);ok{
    fmt.Println(p,p.name)
}

这种s.(Person)的写法称为类型断言,通过这种ok-idiom的方式可以将接口类型还原为原始类型

方法②:type switch

switch p := s.(type){
    catch Person:
        p.name="zs"
        fmt.Println(p) //{zs 33}
    default:
        fmt.Println("不是Person类型")
}

  

 

标签:name,fmt,接口,GoLang,func,Println,type
From: https://www.cnblogs.com/ShineLeBlog/p/17647851.html

相关文章

  • golang 学习笔记 -- for
    forrange 遍历取不到所有元素的指针orgItems:=[]int{1,2,3}varnewItems[]*intfor_,item:=rangeorgItems{fmt.Println(item)//123fmt.Printf("%p\n",&item)//每次地址都是相同的newItems=append(newItems,&item)}for_,ite......
  • GoLang:指针
    学习自:GoLang教程110页1、普通指针说明指针变量用于存放其他变量的地址无论指向什么类型的变量,指针的实际内存占用都是一样的:32位4B,64位8B:varp1*int;varp2*float64;varp3*bool;fmt.Println(unsafe.Sizeof(p1))//8fmt.Println(unsafe.Sizeof(p2))//8fmt.Println(u......
  • 类与接口
    抽象类和接口的对比:抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。相同点:•接口和抽象类都不能实例化•都位于继承的顶端,用于被其他实现或继承•都包含抽象方法,其子类都......
  • Apipost中自定义接口字段如何配置
    Apipost项目设置中可以配置接口文档中的自定义接口字段,创建状态码字典。分享分档时会展示到文档页面状态码字典在状态码字典中可以自定义状态码即其含义自定义的状态码会在分享的API文档中展示接口属性接口属性中可以自定义接口和接口文档展示字段,在接口属性中添加一个时间类型字段......
  • RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解
    大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。WebSocket协议WebSocket是一种在单个TCP连接上进行全双工通信的API技术。相比于传统的HTTP请求,We......
  • Apipost中自定义接口字段如何配置
    Apipost项目设置中可以配置接口文档中的自定义接口字段,创建状态码字典。分享分档时会展示到文档页面状态码字典在状态码字典中可以自定义状态码即其含义 自定义的状态码会在分享的API文档中展示 接口属性接口属性中可以自定义接口和接口文档展示字段,在接口属性中添加一......
  • RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解
    大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。WebSocket协议WebSocket是一种在单个TCP连接上进行全双工通信的API技术。相比于传统的HTTP请......
  • RTSP/Onvif视频服务器EasyNVR安防视频云服务调用接口录像会被自动删除的问题解决方案
    EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台,可支持将接入的视频流进行全平台、全终端的分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力,可应用在智慧校园、智慧工厂、智慧水利等场景中。有用户反馈,在使用EasyNVR接入设备......
  • GoLang:map
    学习自:GoLang学习手册100页1、说明map,即字典,存储一系列的K-V对,通过Key获取响应的元素。2、定义1)定义dic:= map[K类型]V类型{K1:V1,K2:V2,K3:V3,...}vardicmap[K类型]V类型=map[K类型]V类型{K1:V1,K2:V2,K3:V3,...}dic:=map[int]int{0:1,1:3,2:5}//dic为map[0:1,1:......
  • API接口的对接流程和注意事项
    API接口的对接流程和注意事项随着互联网技术的发展和数字化时代的到来,API接口已经成为应用程序之间进行数据交换和通信的重要方式。API即应用程序接口,是一种定义、调用和交互的规范,使得不同应用程序之间可以相互调用和共享资源。本文将从程序员的视角出发,详细介绍API接口的对接流......