Go 언어는 인터페이스를 개발할 수 있습니다. Go 언어의 인터페이스는 Go 언어의 중요한 부분입니다. 인터페이스가 하는 일은 사양이나 프로토콜을 정의하는 것과 같습니다. 인터페이스 키워드는 인터페이스를 정의하기 위해 go 언어에서 사용됩니다. 구문은 "유형 인터페이스 유형 이름 인터페이스{메소드 이름 1(매개변수 목록 1) 반환 값 목록 1 메서드 이름 2(매개변수 목록 2) 반환 값 목록 2.. .}".
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
인터페이스는 우리에게 친숙한 개념일 것입니다. Java에 더 익숙한 우리와 같은 프로그래머에게는 인터페이스가 Go 언어에서 어떻게 사용되는지 살펴보겠습니다. , 일상적인 개발에서 인터페이스가 수행하는 역할.
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: 유형 인터페이스의 변수를 나타냅니다.{}
该语法返回两个参数,第一个参数是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语言中的使用十分广泛。
关于接口需要注意的是,只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要定义接口。不要为了接口而写接口,那样只会增加不必要的抽象,导致不必要的运行时损耗。
위 내용은 언어로 인터페이스를 개발할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!