【Duke】Go语言的相关接口 014 - PingPongGooo/GoFoundation GitHub Wiki

Go的接口,和其他编程语言的接口有很大的区别

接口与依赖

Java中的接口

Programmer.java

public interface Programmer{
    String WriteCodes();
}

GoProgrammer.java

public class GoProgrammer implements Programmer{
   @Override
   public String WriteCodes(){
       return "dd"
   }
}

Task.java

public class Task{
    public static void main(String[] args){
        Programmer prog = new  GoProgrammer();
        ......
    }
}

可以发现。 三个东西根本分不开。 依赖严重

Duck Type 式接口实现

接口定义
type Programmer interface{
   WriteHelloWorld()code
}
接口实现
type Goprogrammer struct{

}

// 把 WriteHelloWorld 方法 绑定到  p* GoProgrammer 结构上

func (p* GoProgrammer) WriteHelloWorld()code{
    return "hello world"
}
package _interface

import "testing"

type Programmer interface {
	WriteHelloWorld() string
}

type GoProgrammer struct {  // 没有 使用implement 去和 programmer 绑定.

}

func (g *GoProgrammer) WriteHelloWorld() string{  // 方法签名看起来是一样的。 就是接口实现。  duck type  
	return "Hello world"
}

func TestClient(t *testing.T)  {
	var p Programmer
	p =  new(GoProgrammer)
	t.Log(p.WriteHelloWorld())
}

Go 接口

与其他主要编程语言的差异

1. 接口为非入侵性,实现不依赖于接口定义
2. 所以接口的定义可以包含在接口使用者包内, 不相java需要一个 专门用于接口定义的 package 不会有循环依赖。

接口变量

var prog Coder = &GoProgrammer{}

类型  type GoProgrammer struct{}
数据  &GoProgrammer{}

自定义类型

1. type IntConvertionFn func(n int) int
2. type MyPoint int