Go接口interface的用法介绍
go 的接口在go的编程里面用的十分频繁,尤其是空接口的使用,因为有了接口,才使得Go语言变得异常的强大。 go语言教程栏目就来为大家介绍一下Go接口interface的用法。
关于接口的概念:
1.接口是一个或多个方法签名的集合
2.只要某个类型拥有该接口的所有方法签名,就算实现了该接口,无需显示声明实现了哪个接口,这称之为 Structural Typing
3.接口只有方法声明,没有实现,没有数据结构字段
4.接口可以匿名嵌入其他接口,或者嵌入到接口中
5.将对象复制给接口,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针
6.接口调用不会做receiver的自动转换
7.接口也可以实现类似OOP中的多态
8.空接口可以作为任何类型数据的容器
现在开始介绍一下最基础的interface。 介绍一下概念2
package main import ( "fmt" ) type USB interface { // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名, Name() string //即就实现了PhoneConnect的接口,无需在声明。这就是上面说的第2条 Connect() } type PhoneConnect struct { //定义的结构体 name string } func (pc PhoneConnect) Name() string{ //上面结构体的方法 return pc.name } func (pc PhoneConnect) Connect(){ fmt.Println("Connectd to: ",pc.name) } func main(){ var a USB //声明该接口 a = PhoneConnect{"IPhone"} //该接口已经支持PhoneConnect这个结构体了。初始化该结构体 a.Connect() //调用该结构体的Connect方法 }
如果上面的例子看明白了的话接着往下看。
再定义一个函数,接收参数为USB类型。把a传进去,其实a已经可以调用phoneConnect的所有方法了。而且这时,我把a的声明弄得含糊点。
func Disconnect(usb USB){ fmt.Println("Discounnectd from:",usb.Name()) } func main(){ a := PhoneConnect{"IPhone"} //a是什么类型呢? fmt.Println("type:",reflect.TypeOf(a)) Disconnect(a) }
看看运行结果:
type: main.PhoneConnect
Discounnectd from: IPhone
a是一个被实例化的PhoneConnect类型的结构体,但Disconnect函数要求接收一个USB类型的数据,a竟然可以传递进来!!!
再来看看概念7:
type USB interface { // 定义一个USB接口 ,该接口拥有PhoneConnect的所有方法签名, Name() string // Connect //嵌入了一个Connect接口,效果和最开始演示的是一样的 } type Connect interface { Connect() }
那任何结构体满足拥有Name()和Connect()方法就可以看作是一个USB。是不是有些不妥,DisConnect()函数万一我传递进去的USB不是手机呢??这就用个ok-pattern就可以了。比如,我再加一个电视这个结构体,电视也有usb接口。
type TVConnect struct { name string } func (tc TVConnect) Name() string{ return tc.name } func (tc TVConnect) Connect() { fmt.Println("Connect to: ",tc.name) } func Disconnect(usb USB){ if rs,ok := usb.(PhoneConnect);ok{ fmt.Println("Disconnect: ",rs.name) }else{ fmt.Println("Unknown device: ") } } func main(){ a := PhoneConnect{"IPhone"} b := TVConnect{"ChuangWei"} Disconnect(a) Disconnect(b) }
看看打印结果:
Disconnect: IPhone
Unknown device:
b是一个创维电视的usb接口,但是b在Disconnect函数里没有被识别,因为他是一个TV。
再次进阶。那既然可以在Disconnect函数里面再判断传进来的数据的结构,那么就不用再管USB接口类型了吧。直接定义成空接口。不就就完了,反正我是在函数里面判断你是什么类型呢。
func Disconnect(usb interface{}){ //注意,这里是空接口 switch v:=usb.(type) { case PhoneConnect: fmt.Println(" Phone device Disconnected from",v.name) case TVConnect: fmt.Println("TV device Disconnected from",v.name) default: fmt.Println("Unknown device ...") } } func main(){ a := PhoneConnect{"IPhone"} b := TVConnect{"ChuangWei"} Disconnect(a) Disconnect(b) }
看看打印情况:
Phone device : Disconnected from IPhone
TV device : Disconnected from ChuangWei
更多go语言知识请关注php中文网go语言教程栏目。
Atas ialah kandungan terperinci Go接口interface的用法介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Dalam Go, kitaran hayat fungsi termasuk definisi, pemuatan, pemautan, pemulaan, panggilan dan skop pembolehubah dibahagikan kepada tahap fungsi dan tahap blok Pembolehubah dalam fungsi boleh dilihat secara dalaman, manakala pembolehubah dalam blok hanya kelihatan dalam blok .

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Bahasa Go dan Go adalah entiti yang berbeza dengan ciri yang berbeza. Go (juga dikenali sebagai Golang) terkenal dengan kesesuaiannya, kelajuan penyusunan pantas, pengurusan memori dan kelebihan merentas platform. Kelemahan bahasa Go termasuk ekosistem yang kurang kaya berbanding bahasa lain, sintaks yang lebih ketat dan kekurangan penaipan dinamik.

Lihat dokumentasi fungsi Go menggunakan IDE: Tuding kursor pada nama fungsi. Tekan kekunci pintas (GoLand: Ctrl+Q; VSCode: Selepas memasang GoExtensionPack, F1 dan pilih "Go:ShowDocumentation").

Menulis dokumentasi yang jelas dan komprehensif adalah penting untuk rangka kerja Golang. Amalan terbaik termasuk mengikut gaya dokumentasi yang ditetapkan, seperti Panduan Gaya Pengekodan Google. Gunakan struktur organisasi yang jelas, termasuk tajuk, subtajuk dan senarai, serta sediakan navigasi. Menyediakan maklumat yang komprehensif dan tepat, termasuk panduan permulaan, rujukan API dan konsep. Gunakan contoh kod untuk menggambarkan konsep dan penggunaan. Pastikan dokumentasi dikemas kini, jejak perubahan dan dokumen ciri baharu. Sediakan sokongan dan sumber komuniti seperti isu dan forum GitHub. Buat contoh praktikal, seperti dokumentasi API.

Unit menguji fungsi serentak adalah penting kerana ini membantu memastikan kelakuan mereka yang betul dalam persekitaran serentak. Prinsip asas seperti pengecualian bersama, penyegerakan dan pengasingan mesti dipertimbangkan semasa menguji fungsi serentak. Fungsi serentak boleh diuji unit dengan mensimulasikan, menguji keadaan perlumbaan dan mengesahkan keputusan.
