go接口定义、实现、多态

简介: go接口定义、实现、多态

一、接口定义

//定义接口
type Programmer interface {
  WriteHelloWorld() string
}

二、接口实现

type GoProgramer struct{}
 
//接口的实现 方法签名一致
func (p *GoProgramer) WriteHelloWorld() string {
  return "hello"
}
import "testing"
 
//定义接口
type Programmer interface {
  WriteHelloWorld() string
}
 
type GoProgramer struct{}
 
//接口的实现 方法签名一致
func (p *GoProgramer) WriteHelloWorld() string {
  return "hello"
}
 
func TestClient(t *testing.T) {
  var pro Programmer = new(GoProgramer)
  t.Log(pro.WriteHelloWorld())
}

 

=== RUN   TestClient
    ch12_test.go:19: hello
--- PASS: TestClient (0.00s)
PASS

三、多态

import (
  "fmt"
  "testing"
)
 
//定义接口
type Programmer interface {
  WriteHelloWorld() string
}
 
type GoProgramer struct{}
 
//接口的实现 方法签名一致
func (p *GoProgramer) WriteHelloWorld() string {
  return "go hello world"
}
 
type JavaProgramer struct{}
 
//接口的实现 方法签名一致
func (p *JavaProgramer) WriteHelloWorld() string {
  return "java hello world"
}
 
func writeFirstProgram(p Programmer) {
  //%T类型  %v
  fmt.Printf("%T %v\n", p, p.WriteHelloWorld())
}
 
func TestPloymorphism(t *testing.T) {
  //goProg := new(GoProgramer)
  goProg := &GoProgramer{}
  javaProg := new(JavaProgramer)
  writeFirstProgram(goProg)
  writeFirstProgram(javaProg)
}

 

=== RUN   TestPloymorphism
*interface_test.GoProgramer go hello world
*interface_test.JavaProgramer java hello world
--- PASS: TestPloymorphism (0.00s)
PASS

四、空接口

import (
  "fmt"
  "testing"
)
 
//使用小接口定义,较大接口,可以由多个小接口定义组合而成;只依赖必要功能的最小接口
func DoSomething(p interface{}) {
  //if i, ok := p.(int); ok {
  //  fmt.Println("Integer", i)
  //  return
  //}
  //if i, ok := p.(string); ok {
  //  fmt.Println("string", i)
  //  return
  //}
  //fmt.Println("Unkonw Type")
 
  switch v := p.(type) {
  case int:
    fmt.Println("Integer", v)
  case string:
    fmt.Println("string", v)
  default:
    fmt.Println("Unkonw Type")
  }
}
 
func TestEmptyInterfaceASssertion(t *testing.T) {
  DoSomething(10)
  DoSomething("hello")
}
=== RUN   TestEmptyInterfaceASssertion
Integer 10
string hello
--- PASS: TestEmptyInterfaceASssertion (0.00s)
PASS

五、自定义type

import (
  "fmt"
  "testing"
  "time"
)
 
//自定义类型 简化代码
type IntConv func(op int) int
 
//返回一个函数的运行时间
func timeSpent(inner IntConv) IntConv {
  return func(n int) int {
    start := time.Now()
    ret := inner(n)
    fmt.Println("time spent", time.Since(start).Seconds())
    return ret
  }
}
func slowFun(op int) int {
  time.Sleep(time.Second * 1)
  return op
}
func TestFn(t *testing.T) {
  num := timeSpent(slowFun)(5)
  t.Log(num)
}
目录
相关文章
|
10天前
|
Go 数据库
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
|
1月前
|
存储 Go 开发者
【Go语言专栏】深入探索Go语言的接口与多态
【4月更文挑战第30天】本文探讨了Go语言中的接口和多态性。接口是方法集合的抽象类型,允许不同类型的值实现相同的方法,实现多态。接口定义不包含实现,仅包含方法签名。类型实现接口是隐式的,只要实现了接口所需的方法。接口用于编写与具体类型无关的通用代码。通过接口,不同类型的对象可以响应相同消息,展现多态性。此外,接口可以嵌入以继承其他接口,类型断言则用于访问接口内部的具体类型。空接口可存储任何类型值。理解并掌握接口有助于编写更灵活、模块化的Go代码。
|
Java Go
Go语言实现多态
Go语言实现多态
207 0
Go语言实现多态
Go-面向对象编程详解(封装、继承、多态等)
Go-面向对象编程详解(封装、继承、多态等)
153 0
Go-面向对象编程详解(封装、继承、多态等)
【GO】面向对象:多态之类型断言
【GO】面向对象:多态之类型断言
85 0
【GO】面向对象:多态之类型断言
【GO】面向对象:多态
【GO】面向对象:多态
93 0
【GO】面向对象:多态
|
Java Go
Go中的接口多态及嵌入类
我感觉个还好理解, 至少比当初入JAVA时更容易理解, 可能是以前的学习为现在打下了基础吧。 又或许是最近三年的程序编写,长了见识吧~
1127 0
|
Java Go
go语言多态接口样例
感觉比java玄幻啊~~~ package main import ( "fmt" ) type notifier interface{ notify() } type user struct { name string email string } func (u *user) notify() { fmt.
966 0
|
7天前
|
安全 测试技术 Go
Go语言在高并发场景下的应用
在当今互联网高速发展的时代,高并发已成为众多应用系统面临的核心问题。本文探讨了Go语言在高并发场景下的优势,并通过具体实例展示了其在实际应用中的效果和性能表现。