小工具      在线工具  汉语词典  css  js  c++  java

Go语言方法实现接口

Go,golang,开发语言 额外说明

收录于:152天前

接口

在Go语言中,接口不需要显式声明。只需要通过方法实现接口的功能并指向自定义类型(结构体或其他自定义类型变量)。 Go 不关心具体实现的接口,只关心实现该接口的函数。

当实现接口的功能时,方法指向的数据结构自动实现同名函数的接口,因此可以实现多重继承,降低耦合。

接口是带有方法的接口。所有接口都没有方法体。该接口不需要显式实现。只要实现了接口的方法,就是接口的实现类型。

package main

import (
	"fmt"
)

func main() {
    
	phone1 := Phone{
    }
	phone1.start()
	phone1.stop()

	camera1 := Camera{
    }
	camera1.start()
	camera1.stop()

}

//定义接口
type USB interface {
    
	start()
	stop()
}

// 手机结构体
type Phone struct {
    
}

// 方法将结构体与函数联系起来
func (p Phone) start() {
    
	fmt.Println("phone usb is working")
}

func (p Phone) stop() {
    
	fmt.Println("phone usb is stopping")
}

// 摄像机结构体
type Camera struct {
    
}

func (c Camera) stop() {
    
	fmt.Println("camera usb is stopping")
}

func (c Camera) start() {
    
	fmt.Println("camera usb is working")
}

接口默认为指针类型,如果不初始化则默认为nil。空接口没有任何方法,因此所有类型都实现空接口。

一个类型需要实现了接口,才能将实例赋给接口类型变量,主要是自定义(通过type关键字)的类型,都可以实现接口,不仅仅是结构体。一个自定义的类型可以实现多个接口,接口也可以继承别的接口,通过及接口内嵌完成,必须将接口的所有方法都实现。

由于Go继承的独特性,没有class,implements等关键字的显示声明,仅仅和函数强关联,依次在Go实现多继承时,变量的类型仍然唯一。如下:

class A{
    

}

class B{
    
}

class C extends A,B{
    

}

如果在Java中多继承,就会出现类的成员变量和方法均不一样的状况,
如果实现多继承,那么子类就是两个父类的并集,子类有了其本该具有的特性和行为。这显然不太合理。
type A interface{
    
	method1()
	method2()
	...
}

type B interface{
    
	function1()
	function2()
	...
}

type C struct {
    
}

func (c C) method1(){
    
}

func (c C) function1(){
    
}

在Go中多继承,每个结构体有自己独特的属性,另外话可以选择性的继承接口的方法,
使结构体具有自己独特的行为

在Go语言中,只有实现了接口的所有方法,自定义类型才可以说实现了接口。在接口实现过程中,自定义类型和接口的方法可能会交叉,也可能直接实现接口的所有方法。

package main

import "fmt"

//父母接口
type Parent interface {
    
	ShowParent()
}

//亲戚接口
type Relative interface {
    
	ShowRalative()
}

//儿子结构体
type Son struct {
    
	name string
}

func (son Son) ShowSon() {
    
	fmt.Println("my name is mike")
}

func (son Son) ShowParent() {
    
	fmt.Println("my parent ...")
}

func (son Son) ShowRalative() {
    
	fmt.Println("my relative...")
}

func main() {
    
	var son Son
	son.name = "xiaoxu"
	son.ShowParent()
	son.ShowRalative()
	son.ShowSon() 

}

自定义类型可以实现多个接口并与接口方法相交。

type myType int

func (mype myType) ShowRalative() {
    
	fmt.Println("float is my relative")
}

func (mype myType) ShowParent() {
    
	fmt.Println("integer is my ShowParent")
}

接口继承

Go接口之间也可以发生继承,继承后的接口拥有父类的所有方法。

type A interface {
    
	Aint()
}

type B interface {
    
	Bint()
}

type C interface {
    
	A
	B
}

以前结构体和接口是不能继承的。一个代表元素的集合,另一个代表方法的集合。

type A interface {
    
	Aint()
}

type ATest struct {
    
	A
}

接口是一种类型,所以在接口体中也可以这样写。但由于接口方法没有方法体,所以必须继承并重写。因此无法实例化接口,所以上面的写法不会报语法错误,但语义错误。的。编译失败。

. . .

相关推荐

额外说明

哪些特殊字符可以方便地用作分隔符?

    ☆ * ^      ♩ ♪ ♫ ♬    °′〃$£¥‰%℃¤¢   记得转义,在java处理时。   String [] aa1 = cSort.split("\\♪");

额外说明

【转载】C++标准模板库(STL)中map的使用详解

Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,

额外说明

DB2 常用命令

  备份db2方法: 进入命令窗口,执行以下命令: Db2stop  force 停止db2,断开所有的db2连接; Db2start      启动db2; db2 activate database sample;//激活数据库 Db2  backu

额外说明

Unity与 SO 交互 ☀️| 详细讲解 怎样通过 Android Studio 生成一个.so文件 并简单调用!

本文章是Unity与 SO 交互的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————-订阅专栏- 就可以免费观看多篇相关内容的文章啦! -前言 -SO文件生成 -通过Android Studio生成.so文件 -️‍-第一步:下载配

额外说明

【Java 数据结构 & 算法】宁可累死自己, 也要卷死别人 10 哈希实现

【Java 数据结构 & 算法】⚠️宁可累死自己, 也要卷死别人 10⚠️ 哈希实现 概述 获取哈希值 哈希冲突 概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 获取哈希值 hashCode()方法可以返回一个对象的哈希值

额外说明

[译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)

原文地址:https://oracle-base.com/articles/21c/sql-set-operator-enhancements-21c 原文作者:Tim Hall Oracle 21C 新增许多对 SQL 集合运算符的增强,包括 EXCE

额外说明

PyTorch深度学习实战(15)——迁移学习

PyTorch深度学习实战(15)——迁移学习 0. 前言 1. 迁移学习 1.1 迁移学习基本概念 1.2 迁移学习的重要性 1.3 ImageNet 1.4 迁移学习流程 2. VGG16 架构 3. 使用预训练 VGG16 模型实现猫狗分类 小结

额外说明

leetcode 100: 判断两个二叉树是否相同

想法: 首先,判断两个树是否有节点,如果两个树都没有节点,那么两个树一样,返回True。 接着,如果一个树有节点,一个树没有节点,那么两个树不一样,返回False。如果两个树都有节点,但节点的数值不一样,同样返回False。 最后对左子树和右子树应用同样

额外说明

用myeclipse首次配Struts的错误

首先下载架包 我一开始下载的架包是 struts-2.5.16-all.zip struts-2.5.16-lib.zip 虽然解压成功了,但是缺少核心文件xwokr-core.2.3.4.jar,而这个包jar包是核心包,因为,虽然通过builderp

额外说明

深入浅出JVM调优,看完你就懂

深入浅出JVM调优 基本概念: JVM将内存区域分为堆、栈和方法。由于本文主要讲解 JVM 调优,因此我们可以简单理解为 JVM 中的堆区存储的是实际的对象,需要进行 GC。其他都不需要 GC。 下图是JVM的内存模型 从图中我们可以看出 1、JVM本质

ads via 小工具