首页 > 其他分享 >Golang:3.7、Golang接口 interface

Golang:3.7、Golang接口 interface

时间:2022-10-22 19:03:20浏览次数:52  
标签:fmt dog 接口 Golang 3.7 func interface type eat

3.7、Golang接口 interface

go语言中的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型制药实现了这些方法就是实现了这个接口

语法

// 定义接口
type interface_name interface {
    method_name [return_type]
    ...
}

// 定义结构体
type struct_name struct {
    
}

// 实现接口方法
func (struct_name_variable struct_name) method_name [return_type]{
    // 方法实现
}

接口示例

定义一个USB接口,有读read 写write两个方法

再定义一个电脑computer 和 手机Mobile 来实现这个接口

package main

import "fmt"

// USB接口
type USB interface {
    read()
    write()
}

// Computer 结构体
type Computer struct {
}

// Mobile 结构体
type Mobile struct {
}

// Computer 实现USB方法
func (computer Computer) read() {
    fmt.Println("computer read")
}

func (computer Computer) write() {
    fmt.Println("computer write")
}

// Mobile 实现USB方法
func (mobile Mobile) read() {
    fmt.Println("mobile read")
}

func (mobile Mobile) write() {
    fmt.Println("mobile write")
}

func main() {

    computer := Computer{}
    computer.read()
    computer.write()
    // computer read
    // computer write

    mobile := Mobile{}
    mobile.read()
    mobile.write()
    // mobile read
    // mobile write

}

备注: 实现接口必须实现接口中的所有方法

golang接口值类型接收者和指针类型接收者

示例

package main

import "fmt"

// 定义接口
type Pet interface {
    eat()
}

// 定义结构体
type Dog struct {
    name string
}

func (dog Dog) eat() {
    fmt.Println("dog eat")
}

func main() {
    dog := Dog{name: "Tom"}
    dog.eat()
    // dog eat
}

golang接口和类型的关系

  • 一个类型可以实现多个接口
  • 多个类型可以实现同一个接口(多态)

一个类型可以实现多个接口

示例

Music接口可以播放音乐 Video接口可以播放视频

手机Mobile实现这两个接口,即可以播放音乐,又可以播放视频

package main

import "fmt"

// 定义接口
type Music interface {
    playMusic()
}

type Video interface {
    playVideo()
}

// 定义结构体
type Mobile struct {
}

func (m Mobile) playMusic() {
    fmt.Println("Mobile playMusic")
}

func (m Mobile) playVideo() {
    fmt.Println("Mobile playVideo")
}

func main() {
    m := Mobile{}
    m.playMusic()
    // Mobile playMusic
    m.playVideo()
    // Mobile playVideo

}

多个类型可以实现同一个接口(多态)

示例

一个宠物接口Pet,猫Cat和狗Dog都可以实现该接口

package main

import "fmt"

// 定义接口
type Pet interface {
    eat()
}

// 定义结构体
type Dog struct {
}

type Cat struct {
}

func (dog Dog) eat() {
    fmt.Println("dog eat")
}

func (cat Cat) eat() {
    fmt.Println("cat eat")
}

func main() {
    dog := Dog{}
    dog.eat()
    // dog eat

    cat := Cat{}
    cat.eat()
    // cat eat

    // 声明接口变量
    var pet Pet
    pet = dog
    pet.eat()
    // dog eat

    pet = cat
    pet.eat()
    // cat eat
}

golang接口嵌套

示例

飞鱼,既可以飞,也可以游泳,

飞鱼接口有两个接口组成:飞Fly接口,游泳Swim接口

package main

import "fmt"

// 定义接口
type Flyer interface {
    fly()
}

// 定义接口
type Swimmer interface {
    swim()
}

// 组合接口
type FlyFish interface {
    Flyer
    Swimmer
}

// 结构体
type Fish struct{}

// 实现方法
func (fish Fish) fly() {
    fmt.Println("fish fly")
}

func (fish Fish) swim() {
    fmt.Println("fish swim")
}

func main() {
    var fly FlyFish

    fly = Fish{}
    fly.fly()
    // fish fly

    fly.swim()
    // fish swim
}

通过接口实现OCP设计原则

开闭原则 Open-Closed Principle

对扩展开放,对修改关闭

示例

package main

import "fmt"

// 定义接口
type Pet interface {
    eat()
    sleep()
}

// 定义结构体
type Dog struct {
}

type Cat struct {
}

// Dog 实现 Pet接口
func (dog Dog) eat() {
    fmt.Println("dog eat")
}

func (dog Dog) sleep() {
    fmt.Println("dog sleep")
}

// Cat 实现 Pet接口
func (cat Cat) eat() {
    fmt.Println("cat eat")
}

func (cat Cat) sleep() {
    fmt.Println("cat sleep")
}

// 结构体
type Person struct{}

// 参数既可以是Dog 也可以是 Cat
func (person Person) care(pet Pet) {
    pet.eat()
    pet.sleep()
}

func main() {

    dog := Dog{}
    cat := Cat{}

    person := Person{}

    person.care(dog)
    // dog eat
    // dog sleep

    person.care(cat)
    // cat eat
    // cat sleep
}

golang模拟OOP的属性和方法

golang中没有面向对象的概念,也没有封装的概念,但是可以通过而机构提struct和函数绑定来实现OOP的属性和方法

示例

Person类

  • 属性: name、age
  • 方法:eat、sleep、work
package main

import "fmt"

// 属性
type Person struct {
	name string
	age  int
}

// 方法
func (person Person) eat() {
	fmt.Println("person eat")
}

func (person Person) sleep() {
	fmt.Println("person sleep")
}

func (person Person) wrok() {
	fmt.Println("person wrok")
}

func main() {
	person := Person{
		name: "Tom",
		age:  23,
	}
	person.eat()
	// person eat

	person.sleep()
	// person sleep

	person.wrok()
	// person wrok
}

golang继承

通过结构体嵌套来实现继承

package main

import "fmt"

// 定义结构体
type Pet struct {
    name string
    age  int
}

func (pet Pet) eat() {
    fmt.Println("pet eat")
}

func (pet Pet) sleep() {
    fmt.Println("pet sleep")
}

// 定义结构体
type Dog struct {
    // 匿名
    Pet
}

type Cat struct {
    pet Pet
}

func main() {

    dog := Dog{
        Pet{name: "Tom", age: 23},
    }

    // 匿名直接调用
    dog.eat()
    // pet eat

    cat := Cat{
        pet: Pet{name: "Tom", age: 23},
    }

    // 通过属性pet 调用
    cat.pet.eat()
    // pet eat

}

golang构造函数

golang中没有构造函数的概念,可以使用函数来模拟构造函数的功能

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func NewPerson(name string, age int) (*Person, error) {
    if name == "" {
        return nil, fmt.Errorf("name不能为空")
    }

    if age < 0 {
        return nil, fmt.Errorf("age不能小0")
    }

    return &Person{name: name, age: age}, nil
}

func main() {
    person, err := NewPerson("Tom", 23)
    if err == nil {
        fmt.Printf("%v\n", person)
        // &{Tom 23}
    } else {
        fmt.Printf("%v\n", err)
    }
}

标签:fmt,dog,接口,Golang,3.7,func,interface,type,eat
From: https://blog.51cto.com/mouday/5786056

相关文章

  • Golang-Gin Response 统一返回restful格式的数据
    目的:gin返回restful格式的数据,返回的200,201的数据也包括异常时的404/500等情况直接调用即可packageresponseimport( "github.com/gin-gonic/gin" "net/http")......
  • Golang 几个小时前 几分钟 几天前的处理
    在用golang爬虫的时候总会遇到10天前10分钟前刚刚这种很影响我们爬取正常事件所以我写了个方法来格式化这种事件packageutilsimport( "fmt" "regexp" "strco......
  • Golang 和 Python 随机生成N位字符串
    Golang:funcRandomString(nint)string{ varletters=[]byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789") result:=make([]byte,n) /......
  • Golang基础-运算符
    运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等运算符分为:算术运算符:+、-、*、/,%,++,--赋值运算符:=、+=、-=、*=、/=、%=关系运算符:==、!=、>、<、>=、<=......
  • Golang基础-变量与数据类型
    变量变量的定义1.声明2.赋值3.使用//声明:var变量名变量类型varnamestring//赋值:name="xiaoming"//使用:fmt.Println(name)//声明+赋值//var变......
  • golang中的切片
    索引:https://waterflow.link/articles/1666277946416在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层数......
  • golang中的切片
    索引:https://waterflow.link/articles/1666277946416在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层......
  • Go 语言入门很简单:什么是 Golang
    Golang是一种相对较新的编程语言,很快就流行起来。StackOverflow对开发人员进行了民意调查,发现Golang是学习Go编程语言的第三大热门。为了更好地理解为什么Go如此......
  • TS语法中interface和class的理解
    在TS中interface和后端语言如c#中的概念是不一样的,在TS中interface相当于定义了一种类型,是设置自定义类型的方式,区分与基础类型(number、string等),当定义变量时,就可以设置该......
  • 记录python3.7版本中 Django+celery 启动报错
     虚拟环境启动I报错Traceback(mostrecentcalllast):File"/data/.virtualenvs/cmdb/lib/python3.7/site-packages/gunicorn/arbiter.py",line589,inspawn_w......