go语言中的接口interface

package main;

import "fmt"

//接口interface
//接口是一个或多个方法签名的集合
//只要某个类型拥有该接口的所有方法签名,即算实现该接口。
//接口只有方法声明,没有实现,没有数据字段
//接口可以匿名嵌入其它接口,或嵌入到结构中。

//GO语言中的所有类型都实现了空接口
type Empty interface {
}

type Inf interface {
	getName() string;
	setName(name string);
}

type InfB interface {
	//这里把INF接口嵌入
	Inf;
	getAge() int;
	setAge(age int);
}

type A struct {
	name string;
}

type B struct {
	name string;
	age  int;
}

//结构A实现Inf的接口
func (a *A) getName() string {
	return a.name;
}
func (a *A) setName(name string) {
	a.name = name;
}

//结构B实现InfB的接口
func (b *B) getName() string {
	return b.name;
}
func (b *B) setName(name string) {
	b.name = name;
}
func (b *B) getAge() int {
	return b.age;
}
func (b *B) setAge(age int) {
	b.age = age;
}

//函数test接收一个INF类型的变量
func test(i Inf) {
	fmt.Println("ok");
}

//这里使用空接口类型接收参数
func test2(e Empty) {
	//判断属于哪个接口
	if a, ok := e.(Inf); ok {
		fmt.Println(a, "inf");
	} else if a, ok := e.(InfB); ok {
		fmt.Println(a, "infb")
	}
}

//同上,另一种写法
func test3(e Empty) {
	switch a := e.(type) {
	case Inf:
		fmt.Println(a, "inf");
	case InfB:
		fmt.Println(a, "infb");
	default:
		fmt.Println(a, "no");
	}
}

func main() {
	a := A{};
	a.setName("test");
	fmt.Println(a, a.getName());
	//注意这里需要用取地址符,因为上面的方法绑定都是(a *A)
	test(&a);
	test2(&a);
	test3(&a);

	b := B{};
	b.setName("testb");
	b.setAge(25);
	fmt.Println(b.getName(), b.getAge());
	//结构B实现了Inf和InfB两个接口
	test(&b);
	test2(&b);
	test3(&b);

	//接口InfB可以转化为Inf,但Inf不能转化为InfB
	//只能从超集向子集转
	c := B{};
	//注意这里要传地址
	var d Inf = Inf(&c);
	d.setName("testc");
	fmt.Println(d, d.getName());
}

  

时间: 2024-08-28 19:01:35

go语言中的接口interface的相关文章

go语言之行--接口(interface)、反射(reflect)详解

一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: interface是方法的集合 interface是一种类型,并且是指针类型 interface的更重要的作用在于多态实现 interface定义 type 接口名称 interface { method1 (参数列表) 返回值列表 method2 (参数列表) 返回值列表 ... } interf

【juincen】Java中的接口interface类比js中的回调函数

前几天在左讯飞语音的时候,无意间意识到java中的接口和js中常用的回调函数有点类似,今天在这儿整理一下思路. interface,Java中的接口,为什么会有这个东西. 一,预留声明 比如两个程序员A和B,A要写一段程序,其中需要调用到B写的程序.这时候A可以写一个接口: public interface Demo{ void deal(); } A要调用的方法先“预留声明”在接口里:deal 然后B去完善这个接口,B写了一个实现类实现了这个Demo接口. A在自己的业务逻辑里面只用调用接口的

Ts中的接口interface

接口ITest.ts interface ITest { name:string; age:number; run(); goto(x:number,y:number):number; } 必须继承接口的属性和方法(AS3接口中不能定义属性). 属性和方法必须是public. 类型没有强制和接口一致. class Test implements ITest{ public name:string = "Test"; public age; public run(){ console.l

java中的接口interface

关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 接口中的成员 接口中的所有的成员,缺省情况下都是public的,也必须是public,无论是方法,还是字段.因为接口就是规定了API,如果实现的类不公开接口中的API,怎么能叫API呢? 接口中可以 定义方法 和 字段. 接口中的字段,缺省(也是必须)为 public static final  .在定义的接口中必须初始化,因为是fi

java语言中的接口概述

接口 接口中的成员修饰符是固定的 1,全局常量:public staticfinal 2,抽象方法:public abstract 接口中的成员都是公共的权限. 类与类之间是继承关系,类与接口之间是实现关系. 接口不可以实例化 只能有实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化.否则,这个子类就是一个抽象类. 调用接口的常量时,接口名,接口的子类名,子类的对象都可以进行调用. 在java中不直接支持多继承,因为会出现调用的不确定性. 所以java将多继承机制进行改良,在ja

020_go语言中的接口

代码演示 package main import ( "fmt" "math" ) type geometry interface { area() float64 perim() float64 } type rect struct { width, heigh float64 } type circle struct { radius float64 } func (r rect) area() float64 { return r.width * r.heig

Java中的接口(interface)

Java中提倡面向接口编程,而不是面向类编程,个人理解就是将做什么和怎么做分开,以实现松耦合的目的. 基本数据类型分四类八种 : 整型.浮点型.字符型.布尔型: 引用数据类型分三种 : 类 . 接口 . 数组 : 1.接口不是类: 2.接口中也有属性和方法,接口中的属性默认用 public static final 修饰: 3.接口中的方法默认用 public abstract 修饰,接口中不能包含非抽象方法: 4.一个类可以实现接口,用implements关键字实现,如果一个类实现了接口,那么

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

Android中接口(Interface)的简单使用

  Android中接口(Interface)的简单使用 Java中的接口可以被看作是只包含常量和抽象方法的抽象类 . 可以使用如下方式定义一个接口: public interface InterfaceDemo { int i = 10; void method1(); int method2(); } 使用1: 解决“多重继承”的问题 Java语言本身是不支持类的多重继承(多重继承是指一个类从多个类继承而来,即一个类拥有多个超类)的,但一个类却可以实现多个接口.这样,我们可以将一些抽象方法定