Maison >développement back-end >Golang >Qu'est-ce qu'une interface dans Golang

Qu'est-ce qu'une interface dans Golang

藏色散人
藏色散人original
2019-12-25 17:19:473386parcourir

Qu'est-ce qu'une interface dans Golang

golang Qu'est-ce qu'une interface ?

Si goroutine et canal sont les deux pierres angulaires de la concurrence Go, alors les interfaces sont la clé des types de données dans la programmation en langage Go. Dans la programmation actuelle du langage Go, presque toutes les structures de données tournent autour des interfaces, et les interfaces sont au cœur de toutes les structures de données du langage Go.

Recommandations associées : Tutoriel golang

Interface en golang

Interface

Concept : Une interface définit un ensemble de méthodes, mais ne contient pas d'implémentations spécifiques de ces méthodes, elles sont abstraites et les interfaces ne peuvent pas contenir de variables ;

Format de définition de l'interface

type Namer interface {
method1() return_type
method2() return_type
}

2. Un exemple d'interface

    package main
    import "fmt"
    
    type Message interface {
        Send()
    }
    type user struct {
        name string
        score int
    }
    func (u *user) Send() {
        fmt.Println("hi", u.name, "this is your ", u.score)
    }
    func sendMessage(msg Message) {
        msg.Send()
    }
    func main() {
        u := &user{name: "roty", score: 44}
        sendMessage(&u)
    }

L'interface en Golang rend le codage plus flexible et plus facile à réaliser. expand , ce qui fait que Go possède les caractéristiques du polymorphisme orienté objet.

Il nous suffit de retenir ici trois points :

● Collection des déclarations de méthode

● Tout type d'objet implémente tout ce qui est déclaré dans la méthode d'interface, indiquant que le type implémente l'interface correspondante.

Quantity peut être utilisé comme type de données, et tout objet qui implémente cette interface peut attribuer des valeurs aux variables de type d'interface correspondantes.

Utilisez des exemples pour comprendre les trois points ci-dessus :

package main
import "fmt"
import "math"
// 几何图形的接口(interface)
type geometry interface {
    area() float64
    perim() float64
}
// rect 和 circle 实现 geometry 接口
type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}
// 实现了接口中声明的所有方法即实现了该接口,这里 rects 实现了 geometry 接口
func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}
// circles 实现 geometry 接口
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
// 定义的接口可以作为一种数据类型,当一个变量的类型为一个接口类型时,这个变量可以调用接口中定义的方法。
// 这里定义一个函数,接收一个类型为 geometry 的参数变量
func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}
func main() {
    r := rect{width: 3, height: 4}
    c := circle{radius: 5}
    // The circle and rect struct types both implement the geometry interface so we can use instances of these structs as arguments to measure.
    // rect 和 circle 结构类型都实现了 geometry 接口,所以我们能够把它们的对象作为参数传给 measure 函数
    // 在 measure 函数内部,参数对象调用了所属类型实现的接口方法。
    measure(r)
    measure(c)
}

Tant qu'un type implémente la méthode déclarée par l'interface, il est considéré comme ayant implémenté l'interface. implémentation de plusieurs interfaces en même temps. Une interface peut également être implémentée par plusieurs types. Si un type implémente une interface, alors les objets de ce type peuvent être affectés à des variables de ce type d'interface.

package main
import "fmt"
type I interface {
  method1()
}
type T struct{}
func (T) method1()  {}
func main()  {
  var i I = T{}
  fmt.Println(i)
}

La dernière partie explique le type interface{} Ce type d'interface ne déclare aucune méthode, communément appelée interface vide. Parce que tout type d'objet implémente l'interface vide par défaut (comme mentionné ci-dessus, tant que n'importe quel type implémente la méthode d'interface, il implémentera l'interface correspondante. Puisque l'interface vide n'a pas de méthode, tous les types implémentent l'interface vide par défaut) . Lorsque vous en avez besoin Très utile dans le contexte des variables de type.

package main
import (
    "fmt"
)
func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}
func main() {
    names := []string{"stanley", "david", "oscar"}
    vals := make([]interface{}, len(names))
    for i, v := range names {
        vals[i] = v
    }
    PrintAll(vals)
}
// stanley
// david
// oscar

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Que peut développer Golang ?Article suivant:Que peut développer Golang ?