golang中struct和interface的基礎(chǔ)使用教程
前言
本文主要給大家介紹了關(guān)于golang中struct和interface的相關(guān)內(nèi)容,是屬于golang的基本知識(shí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
struct
struct 用來(lái)自定義復(fù)雜數(shù)據(jù)結(jié)構(gòu),可以包含多個(gè)字段(屬性),可以嵌套;go中的struct類(lèi)型理解為類(lèi),可以定義方法,和函數(shù)定義有些許區(qū)別;struct類(lèi)型是值類(lèi)型。
struct定義
type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User)
struct的方法
在go語(yǔ)言中,我們可以為自定義類(lèi)型定義類(lèi)型相關(guān)的方法,比如:
func (p *player) Name() string{ return p.name }
上面的代碼為player這個(gè)自定義類(lèi)型聲明了一個(gè)名為Name的方法,該方法返回一個(gè)string。值得注意的是(p *player)這段代碼指定了我們是為player創(chuàng)建方法,并將調(diào)用該方法的實(shí)例指針當(dāng)作變量p傳入該函數(shù),如果沒(méi)有(p *player)這段代碼,這個(gè)方法就變成了一個(gè)普通的全局函數(shù)。
struct的嵌入(Embedding)
go語(yǔ)言中的“繼承”和其他語(yǔ)言中的繼承有很大區(qū)別,比如:
type player struct{ User }
這是一種“繼承”的寫(xiě)法,在go語(yǔ)言中這種方式叫做“嵌入”(embed),此時(shí)player類(lèi)型就擁有了User類(lèi)型的Name等變量
struct的tag
這種方式主要是用在xml,json和struct間相互轉(zhuǎn)換,非常方便直觀,比如接口給的參數(shù)一般是json傳過(guò)來(lái),但是內(nèi)部我們要轉(zhuǎn)為struct再進(jìn)行處理。
例子:
import "encoding/json" type User struct { Name string `json:"userName"` Age int `json:"userAge"` } func main() { var user User user.Name = "nick" user.Age = 18 conJson, _ := json.Marshal(user) fmt.Println(string(conJson)) //{"userName":"nick","userAge":0} }
interface
golang不支持完整的面向?qū)ο笏枷?,它沒(méi)有繼承,多態(tài)則完全依賴(lài)接口實(shí)現(xiàn)。golang只能模擬繼承,其本質(zhì)是組合,只不過(guò)golang語(yǔ)言為我們提供了一些語(yǔ)法糖使其看起來(lái)達(dá)到了繼承的效果。Golang中的接口,不需要顯示的實(shí)現(xiàn)。Interface類(lèi)型可以定義一組方法,但是這些不需要實(shí)現(xiàn)。并且interface不能包含任何變量。只要一個(gè)變量,含有接口類(lèi)型中的所有方法,那么這個(gè)變量就實(shí)現(xiàn)這個(gè)接口。因此,golang中沒(méi)有implement類(lèi)似的關(guān)鍵字;如果一個(gè)變量含有了一個(gè)interface類(lèi)型的多個(gè)方法,那么這個(gè)變量就實(shí)現(xiàn)了多個(gè)接口;如果一個(gè)變量只含有了一個(gè)interface的方部分方法,那么這個(gè)變量沒(méi)有實(shí)現(xiàn)這個(gè)接口。
interface的定義
interface類(lèi)型默認(rèn)是一個(gè)指針。
例子:
Interface定義
type Car interface { NameGet() string Run(n int) Stop() }
空接口 Interface{}:空接口沒(méi)有任何方法,所以所有類(lèi)型都實(shí)現(xiàn)了空接口。
var a int var b interface{} //空接口 b = a
interface的多態(tài)
一種事物的多種形態(tài),都可以按照統(tǒng)一的接口進(jìn)行操作。這種方式是用的最多的,有點(diǎn)像c++中的類(lèi)繼承。
例子:
type Item interface { Name() string Price() float64 } type VegBurger struct { } func (r *VegBurger) Name() string{ return "vegburger" } func (r *VegBurger) Price() float64{ return 1.5 } type ChickenBurger struct { } func (r *ChickenBurger) Name() string{ return "chickenburger" } func (r *ChickenBurger) Price() float64{ return 5.5 }
Interface嵌套
一個(gè)接口可以嵌套在另外的接口。即需要實(shí)現(xiàn)2個(gè)接口的方法。在下面的例子中Used就包含了Car這個(gè)接口的所有方法。
例子:
type Car interface { NameGet() string Run(n int) Stop() } type Used interface { Car Cheap() }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
golang使用iconv報(bào)undefined:XXX的問(wèn)題處理方案
這篇文章主要介紹了golang使用iconv報(bào)undefined:XXX的問(wèn)題處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03golang?xorm?自定義日志記錄器之使用zap實(shí)現(xiàn)日志輸出、切割日志(最新)
這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實(shí)現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫(kù)的操作方法及?zap日志工具?,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10Go語(yǔ)言框架Beego項(xiàng)目搭建的方法步驟
這篇文章主要介紹了Go語(yǔ)言框架Beego項(xiàng)目搭建的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Go語(yǔ)言執(zhí)行系統(tǒng)命令行命令的方法
這篇文章主要介紹了Go語(yǔ)言執(zhí)行系統(tǒng)命令行命令的方法,實(shí)例分析了Go語(yǔ)言操作系統(tǒng)命令行的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02go依賴(lài)注入庫(kù)samber/do使用示例講解
這篇文章主要介紹了go依賴(lài)注入庫(kù)samber/do使用,在本文中,我們學(xué)習(xí)了如何使用samber/do在?Go?中提供依賴(lài)注入,需要的朋友可以參考下2024-02-02Go基于GORM 獲取當(dāng)前請(qǐng)求所執(zhí)行的 SQL 信息(思路詳解)
這篇文章主要介紹了Go基于GORM 獲取當(dāng)前請(qǐng)求所執(zhí)行的 SQL 信息(思路詳解),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01golang 函數(shù)返回chan類(lèi)型的操作
這篇文章主要介紹了golang 函數(shù)返回chan類(lèi)型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04