>  기사  >  백엔드 개발  >  언어로 인터페이스를 개발할 수 있나요?

언어로 인터페이스를 개발할 수 있나요?

青灯夜游
青灯夜游원래의
2022-12-15 18:49:415471검색

Go 언어는 인터페이스를 개발할 수 있습니다. Go 언어의 인터페이스는 Go 언어의 중요한 부분입니다. 인터페이스가 하는 일은 사양이나 프로토콜을 정의하는 것과 같습니다. 인터페이스 키워드는 인터페이스를 정의하기 위해 go 언어에서 사용됩니다. 구문은 "유형 인터페이스 유형 이름 인터페이스{메소드 이름 1(매개변수 목록 1) 반환 값 목록 1 메서드 이름 2(매개변수 목록 2) 반환 값 목록 2.. .}".

언어로 인터페이스를 개발할 수 있나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

인터페이스는 우리에게 친숙한 개념일 것입니다. Java에 더 익숙한 우리와 같은 프로그래머에게는 인터페이스가 Go 언어에서 어떻게 사용되는지 살펴보겠습니다. , 일상적인 개발에서 인터페이스가 수행하는 역할.

Concept

Go 언어에서 인터페이스는 Go 언어의 중요한 부분입니다. 인터페이스가 하는 일은 각 구현 당사자에게만 필요한 것입니다. 프로토콜에 따라 구현합니다.

인터페이스는 유형입니다.

인터페이스 유형은 다른 유형의 동작을 추상화하고 일반화한 것입니다. 이 추상 방법을 사용하면 함수를 더욱 유연하게 만들 수 있습니다.

인터페이스 정의

type 接口类型名 interface{
    方法名1( 参数列表1 ) 返回值列表1
    方法名2( 参数列表2 ) 返回值列表2
    …
}

Go 언어에서는 인터페이스 키워드를 사용하여 인터페이스를 정의합니다.

인터페이스 구현 조건

임의의 T 유형의 메소드 세트가 인터페이스 유형의 메소드 세트의 상위 세트인 경우 T 유형이 인터페이스를 구현한다고 말합니다.

인터페이스의 구현은 Go 언어에 암시적입니다. 이는 두 유형 간의 구현 관계가 코드에 반영될 필요가 없다는 것을 의미합니다. Go 언어에는 Java의 구현과 유사한 키워드가 없습니다. Go 컴파일러는 필요할 때 자동으로 두 유형 간의 구현 관계를 확인합니다. 인터페이스를 정의한 후에는 호출자가 인터페이스를 올바르게 컴파일하고 사용할 수 있도록 구현해야 합니다.

인터페이스 구현은 두 가지 규칙을 따라야 합니다.

1. 인터페이스의 메소드는 인터페이스를 구현하는 유형 메소드와 동일한 형식입니다. 메소드는 메소드를 추가하여 구현할 수 있습니다. 유형의 인터페이스 서명과 일치합니다. 서명에는 메서드의 이름, 매개변수 목록, 반환 매개변수 목록이 포함됩니다. 즉, 구현된 인터페이스 유형에 있는 메소드의 이름, 매개변수 목록 및 반환 매개변수 목록 중 하나라도 인터페이스에서 구현하려는 메소드와 일치하지 않는 한 인터페이스의 이 메소드는 구현되지 않습니다.

package main

import "fmt"

type Phone interface {
	Call()
	SendMessage()
}

type HuaWei struct {
	Name  string
	Price float64
}

func (h *HuaWei) Call() {
	fmt.Printf("%s:可以打电话",h.Name)
}

func (h *HuaWei) SendMessage() {
	fmt.Printf("%s:可以发送短信",h.Name)
}

func main() {

	h := new(HuaWei)
	h.Name="华为"
	var phone Phone
	phone = h
	phone.SendMessage()
}

유형이 인터페이스를 구현할 수 없는 경우 컴파일러는 다음과 같은 오류를 보고합니다.

a. 일관되지 않은 함수 이름으로 인해 발생하는 오류

b. 함수를 구현하기 위한 일관되지 않은 메서드 서명으로 인해 발생하는 오류

2. 인터페이스에 여러 메서드가 있는 경우 이러한 메서드를 구현해야 인터페이스를 올바르게 컴파일하고 사용할 수 있습니다. 오류를 신고하세요.

타입과 인터페이스의 관계언어로 인터페이스를 개발할 수 있나요?

타입은 다중 인터페이스를 구현합니다

타입은 다중 인터페이스를 구현할 수 있으며, 인터페이스는 서로 독립적이며 서로의 구현을 알지 못합니다.

예를 들어, 개는 움직이고 전화할 수 있습니다.

func (h *Xiaomi) Call() {
	fmt.Printf("%s:可以打电话",h.Name)
}

func main() {
	h := new(Xiaomi)
	h.Name="小米"
	var phone Phone
	phone = h
	phone.SendMessage()
}

여러 유형이 동일한 인터페이스를 구현합니다.

Go 언어의 다양한 유형도 동일한 인터페이스를 구현할 수 있습니다. 먼저 Mover 인터페이스를 정의합니다. 이동 방법이 있어야합니다.

package main

import "fmt"

type Move interface {
	move()
}
type Say interface {
	say()
}
type Dog struct {
	Name string
}

func (d *Dog) move()  {
	fmt.Printf("%s会动\n", d.Name)
}
func (d *Dog) say()  {
	fmt.Printf("%s会叫汪汪汪\n", d.Name)
}

func main() {
	var m Move
	var s  Say
	d:=&Dog{
		Name: "旺财",
	}
	m = d
	s=d
	m.move()
	s.say()
}
예를 들어 개는 움직일 수 있고, 자동차도 움직일 수 있습니다. 이 관계를 달성하기 위해 다음 코드를 사용할 수 있습니다.

type Mover interface {
    move()
}
이때, 코드에서는 개와 자동차를 하나의 움직이는 객체로 취급할 수 있습니다. 더 이상 주의를 기울여야 합니다. 구체적으로 무엇인지, 이동 메소드를 호출하기만 하면 됩니다.

type dog struct {
    name string
}

type car struct {
    brand string
}

// dog类型实现Mover接口
func (d dog) move() {
    fmt.Printf("%s会跑\n", d.name)
}

// car类型实现Mover接口
func (c car) move() {
    fmt.Printf("%s速度70迈\n", c.brand)
}

빈 인터페이스

빈 인터페이스: 인터페이스{}는 어떠한 메서드도 포함하지 않습니다. 이로 인해 모든 유형은 빈 인터페이스를 구현하므로 빈 인터페이스는 모든 유형의 데이터를 저장할 수 있습니다.

시리즈 함수, 대부분의 매개변수는 빈 인터페이스 유형이며 이는 모든 유형을 지원한다고 할 수도 있습니다.

func main() {
        var x Mover
        var a = dog{name: "旺财"}
        var b = car{brand: "保时捷"}
        x = a
        x.move()
        x = b
        x.move()
    }

빈 인터페이스는 맵의 값으로 사용됩니다

func Print(a ...interface{}) (n int, err error)
func Println(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

fmt 包下的 Print유형 추론

빈 인터페이스 어떤 유형의 값도 저장할 수 있는데, 저장된 특정 데이터를 얻으려면 어떻게 해야 할까요?

인터페이스 값

인터페이스 값(인터페이스 값이라고 함)은 특정 유형과 특정 유형의 값으로 구성됩니다.

이 두 부분을 각각 인터페이스의 동적 유형과 동적 값이라고 합니다.

빈 인터페이스의 값을 판단하려면 이때 유형 어설션을 사용할 수 있습니다. 구문 형식은 다음과 같습니다.

// 空接口作为map值
    var studentInfo = make(map[string]interface{})
    studentInfo["name"] = "李白"
    studentInfo["age"] = 18
    studentInfo["married"] = false
    fmt.Println(studentInfo)
여기서:

x: 유형 인터페이스의 변수를 나타냅니다.{}

  • T: 주장 x를 나타냅니다. 아마도 유형일 것입니다.

该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败。

func main() {
    var x interface{}
    x = "ms的go教程"
    v, ok := x.(string)
    if ok {
        fmt.Println(v)
    } else {
        fmt.Println("类型断言失败")
    }
}

 上面的示例中如果要断言多次就需要写多个if判断,这个时候我们可以使用switch语句来实现:

func justifyType(x interface{}) {
    switch v := x.(type) {
    case string:
        fmt.Printf("x is a string,value is %v\n", v)
    case int:
        fmt.Printf("x is a int is %v\n", v)
    case bool:
        fmt.Printf("x is a bool is %v\n", v)
    default:
        fmt.Println("unsupport type!")
    }
}

因为空接口可以存储任意类型值的特点,所以空接口在Go语言中的使用十分广泛。

总结

关于接口需要注意的是,只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。

【相关推荐:Go视频教程编程教学

위 내용은 언어로 인터페이스를 개발할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.