【Golang 基础系列十六】Go 语言接口

本文介绍了Go语言接口的基础知识,包括接口的概念、语法和示例。接口是方法签名的集合,不包含变量,只声明不实现。讲解了如何定义和实现接口,特别是空接口的特性,它允许接收任何数据类型。此外,还讨论了接口的组合以及接口类型的使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

概述

Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量。

语法

  1. 定义接口

    type [接口名] interface {
        方法名1(参数列表) 返回值列表   
        方法名2(参数列表) 返回值列表
        ...
    }
    

    例子

    type Isay interface{
      sayHi()
    }
    
  2. 实现接口
    例子

    //定义接口的实现类
    type Chinese struct{}
    
    //实现接口
    func (_ *Chinese) sayHi() {
      fmt.Println("中国人说嗨")
    }
    
    //中国人
    type Chinese struct{}
    
    //美国人
    type Americans struct{}
    
    func (this *Chinese) sayHi()  {
      fmt.Println("中国人说嗨")
    }
    
    func (this Americans) sayHi()  {
      fmt.Println("美国人说hi")
    }
    
    //调用
    &Chinese{}.sayHi()
    
    Americans{}.sayHi()
    
  3. 空接口

    在Go语言中,所有其它数据类型都实现了空接口。

    interface{}
    
    var v1 interface{} = 1
    
    var v2 interface{} = "abc"
    
    var v3 interface{} = struct{ X int }{1}
    

    如果函数打算接收任何数据类型,则可以将参考声明为interface{}。最典型的例子就是标准库fmt包中的Print和Fprint系列的函数:

    func Fprint(w io.Writer, a ...interface{}) (n int, err error)
    
    func Fprintf(w io.Writer, format string, a ...interface{})
    
    func Fprintln(w io.Writer, a ...interface{})
    
    func Print(a ...interface{}) (n int, err error)
    
    func Printf(format string, a ...interface{})
    
    func Println(a ...interface{}) (n int, err error)
    
  4. 接口的组合

    一个接口中包含一个或多个接口

    //说话
    type Isay interface{
      sayHi()
    }
    //工作
    type Iwork interface{
      work()
    }
    
    //定义一个接口,组合了上述两个接口
    type IPersion interface{
      Isay
      Iwork
    }
    
    type Chinese struct{}
    
    func (_ Chinese) sayHi() {
      fmt.Println("中国人说中国话")
    }
    
    func (_ Chinese) work() {
    	fmt.Println("中国人在田里工作")
    }
    
    //上述接口等价于:
    type IPersion2 interface {
    	sayHi()
    	work()
    }
    

总结

  1. interface类型默认是一个指针
  2. 使用空接口可以保存任意值
  3. 不能比较空接口中的动态值
  4. 定义了一个接口,这些方法必须都被实现,这样编译并使用

示例


package main

import "fmt"

//中国话
type Isay interface {
	sayHi()
}

//工作
type Iwork interface {
	work()
}

//中国人
type Chinese struct{}

//美国人
type Americans struct{}

func (this *Chinese) sayHi() {
	fmt.Println("中国人说嗨")
}

func (this Americans) sayHi() {
	fmt.Println("美国人说hi")
}

type IPersion interface {
	Isay
	Iwork
}

func (_ Chinese) work() {
	fmt.Println("中国人在田里工作")
}

func main() {
	var chinese Isay = &Chinese{}
	chinese.sayHi()

	Americans{}.sayHi()

	//接口组合
	var ipersion IPersion = &Chinese{}
	ipersion.sayHi()
	ipersion.work()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值