>  기사  >  백엔드 개발  >  Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)

Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)

Go语言进阶学习
Go语言进阶学习앞으로
2023-07-21 14:11:15826검색

인터페이스란 무엇인가요?

여기서 말하는 인터페이스는 슬롯 같은 종류의 인터페이스가 아닙니다.

다양한 언어에서 인터페이스를 언급할 때 일반적으로 사양을 참조하고 특정 개체가 이 사양의 세부 사항을 구현합니다.

<br>

이 글에서 사용된 인터페이스는 주로 Constraint 인터페이스와 Storage 인터페이스입니다.

참고:

Go에서 인터페이스는 유형, 추상 유형이며 메소드만 있고 에는 속성이 없습니다. .

<br>

인터페이스가 필요한 이유

구조에 대해 이야기할 때 Go 언어의 기본 구조(Spring), Go 언어의 기본 구조(Summer), Go 언어의 기본 구조(Summer), Go 언어(가을)에서는 상속 개념을 언급했는데, Go는 구조를 통해 상속을 완성합니다.

<br>

상속 검토

자동차 구조

//车
type Car struct {
    Brand  string //车品牌
    CarNum string //车牌号
    Tyre   int    //轮胎个数
}


//给车绑定一个方法,说明车的基本信息
func (this *Car) carInfo() {
    fmt.Printf("品牌:%s,车牌号:%s,轮胎个数:%d\n", this.Brand, this.CarNum, this.Tyre)
}

자동차 구조에는 4가지 속성과 자동차(carInfo) 정보를 표시하는 메서드가 있습니다. <br>

<br>

BMW 자동차

//宝马车
type BMWCar struct {
    //*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异
    *Car //这就表示继承了Car这个结构体
}

BYD 자동차<br>

//比亚迪车
type BYDCar struct {
    *Car
}

메인코드
func main() {
    //一个宝马对象
    var bmw1 = BMWCar{&Car{
        Brand:  "宝马x8",
        CarNum: "京666",
        Tyre:   4,
    }
}
    //一个比亚迪对象
    var byd1 = BYDCar{&Car{
        Brand:  "比亚迪L3",
        CarNum: "京111",
        Tyre:   4,
    }
}
    //因为 BMWCar 和 BYDCar 都继承了Car,所以都有carInfo这个方法
    bmw1.carInfo()
    byd1.carInfo()
}
<br>

실행 결과

<br>

通过回顾,我们可以发现,车,应该作为一个基本的概念。<br>

上述Car结构体似乎显示了车的属性,其实是不太对的。

车就是一个抽象的概念,电瓶车是车,小轿车也是车,大卡车也是车。

这些车至少有一个统一的功能,那就是跑,但是像几个轮胎了,什么品牌了。

应该是属于自己的,不再是属于Car这个抽象的概念中了,所以,这时候用接口会更好。

<br>

定义接口

车接口

type Car interface {
    //车会跑
    Run(speed int)
    //车需要加油
    Refuel(oil int)
    //车需要转弯
    Wheel(direction string)
}

假设车,至少有这三个动作,不管任何结构体,只要实现了Car里面的所有方法,就代表它一定是一个车。<br>

<br>

宝马车

//宝马车
type BMWCar struct {
    Owner  string //车主
    Brand  string //车品牌
    CarNum string //车牌号
}
//构造方法
func NewBMWCar(owner string, brand string, carNum string) *BMWCar {
    return &BMWCar{Owner: owner, Brand: brand, CarNum: carNum}
}


func (this *BMWCar) Run(speed int) {
    fmt.Printf("我是 %s,我的车是 %s,我车牌号为 %s,我正在以 %d 速度行驶\n", this.Owner, this.Brand, this.CarNum, speed)
}


func (this *BMWCar) Refuel(oil int) {
    fmt.Printf("老板,加%d升油\n", oil)
}


func (this *BMWCar) Wheel(direction string) {
    fmt.Printf("我正在%s转弯\n", direction)
}

电瓶车<br>

<br>
//电瓶车
type Electromobile struct {
    Owner string //车主
    Brand string //车品牌
}


func NewElectromobile(owner string, brand string) *Electromobile {
    return &Electromobile{Owner: owner, Brand: brand}
}
func (this *Electromobile) Run(speed int) {
    fmt.Printf("我是 %s,我的车是 %s,我正在以 %d 速度行驶\n", this.Owner, this.Brand,, speed)
}


func (this *Electromobile) Refuel(oil int) {
    fmt.Printf("你妹的,你电动车加啥油...\n")
}


func (this *Electromobile) Wheel(direction string) {
    fmt.Printf("我正在%s转弯\n", direction)
}

这里是有区别的,电瓶车没有属性CarNum,但是仍然实现了Car接口的所有方法,所以电瓶车在代码上,仍然是车。

main

func main() {
    var 张三的车 Car
    张三的车 = NewBMWCar("张三", "宝马6", "京666")
    张三的车.Run(80)
    张三的车.Refuel(20)
    张三的车.Wheel("左")


    var 李四的车 Car
    李四的车 = NewElectromobile("李四", "小刀电动车")
    李四的车.Run(40)
    李四的车.Refuel(0)
    李四的车.Wheel("左")
}

第2行代码和第8行代码,变量类型是Car接口类型,但是在赋值时,确是其他类型。<br>

Go是强类型语言,为什么类型不一致,还可以赋值,那执行结果会出问题吗???

执行结果

Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)

但是我们发现执行结果是没问题的。<br>

그런데 변수 유형이 일치하지 않고 매번 오류가 보고되는데도 값 할당이 가능한 이유는 무엇일까요?

위의 코드는 BMW 자동차배터리 자동차가 완전히 구현되었음을 확인할 수 있습니다CarCar接口里面所有的方法。

所以可以理解为Car인터페이스의 모든 메소드.

그러니까 <br>자동차

는 그들의 아버지이므로 당연히 그들의 아버지를 이용해 아들을 받을 수 있습니다.

🎜다중 인터페이스를 구현하는 구조🎜🎜🎜🎜다음 코드는 실질적인 의미가 없으며 순전히 문법을 위한 것입니다. 🎜🎜

接口代码

//跑接口
type Runer interface {
  Run()
}


// 跳接口
type Jumper interface {
  Jump()
}

结构体代码

//袋鼠结构体
type Roo struct {
  Name string
}


func (this *Roo) Jump() {
  fmt.Println("我是袋鼠,我会跳")
}


func (this *Roo) Run() {
  fmt.Println("我是袋鼠,我会跑")
}

这个结构体同时实现了两个结构,一个是Runer,一个是Jumper

<br>

main代码

func main() {
  var runner Runer
  var jumper Jumper


  runner = &Roo{Name: "袋鼠"}
  jumper = &Roo{Name: "袋鼠"}


  runner.Run()
  jumper.Jump()
}

Roo既然实现了两个接口,自然两个接口都可以接收Roo这个结构体。

执行结果

Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)

<br>

接口嵌套<br>

接口嵌套这个有点像组合,比如有等这些操作。

例如一个动物,因该是要有这些操作的,那这个动物应该也是一个接口。

并且把这些动作都拿过来才对。

<br>

接口示例代码

//跑接口
type Runer interface {
  Run()
}


// 跳接口
type Jumper interface {
  Jump()
}


//动物接口,继承了 跑 和 跳 
type Animal interface {
  Runer
  Jumper
}

结构体代码

//袋鼠结构体,实现了跑和跳
type Roo struct {
  Name string
}


func (this *Roo) Jump() {
  fmt.Println("我是袋鼠,我会跳")
}


func (this *Roo) Run() {
  fmt.Println("我是袋鼠,我会跑")
}

main代码

func main() {
  var animal Animal


  animal = &Roo{Name: "袋鼠"}
  animal = &Roo{Name: "袋鼠"}


  animal.Run()
  animal.Jump()
}

执行结果

Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)

<br>

요약<br>

위에서 우리는 Go의 기본 인터페이스를 배웠습니다. 주로 인터페이스와 상속의 차이점, 하나의 구조가 여러 인터페이스 , 을 구현합니다. 인터페이스 중첩 .

이해하기 쉽지 않을 수도 있지만 시도해 보고 인내해야 합니다!

위 내용은 Go 언어의 기본 인터페이스를 이해하는 데 도움이 되는 기사(1부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Go语言进阶学习에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제