您好,登錄后才能下訂單哦!
前言
本文主要給大家介紹了關于golang中struct和interface的相關內容,是屬于golang的基本知識,下面話不多說了,來一起看看詳細的介紹吧。
struct
struct 用來自定義復雜數據結構,可以包含多個字段(屬性),可以嵌套;go中的struct類型理解為類,可以定義方法,和函數定義有些許區別;struct類型是值類型。
struct定義
type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User)
struct的方法
在go語言中,我們可以為自定義類型定義類型相關的方法,比如:
func (p *player) Name() string{ return p.name }
上面的代碼為player這個自定義類型聲明了一個名為Name的方法,該方法返回一個string。值得注意的是(p *player)這段代碼指定了我們是為player創建方法,并將調用該方法的實例指針當作變量p傳入該函數,如果沒有(p *player)這段代碼,這個方法就變成了一個普通的全局函數。
struct的嵌入(Embedding)
go語言中的“繼承”和其他語言中的繼承有很大區別,比如:
type player struct{ User }
這是一種“繼承”的寫法,在go語言中這種方式叫做“嵌入”(embed),此時player類型就擁有了User類型的Name等變量
struct的tag
這種方式主要是用在xml,json和struct間相互轉換,非常方便直觀,比如接口給的參數一般是json傳過來,但是內部我們要轉為struct再進行處理。
例子:
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不支持完整的面向對象思想,它沒有繼承,多態則完全依賴接口實現。golang只能模擬繼承,其本質是組合,只不過golang語言為我們提供了一些語法糖使其看起來達到了繼承的效果。Golang中的接口,不需要顯示的實現。Interface類型可以定義一組方法,但是這些不需要實現。并且interface不能包含任何變量。只要一個變量,含有接口類型中的所有方法,那么這個變量就實現這個接口。因此,golang中沒有implement類似的關鍵字;如果一個變量含有了一個interface類型的多個方法,那么這個變量就實現了多個接口;如果一個變量只含有了一個interface的方部分方法,那么這個變量沒有實現這個接口。
interface的定義
interface類型默認是一個指針。
例子:
Interface定義
type Car interface { NameGet() string Run(n int) Stop() }
空接口 Interface{}:空接口沒有任何方法,所以所有類型都實現了空接口。
var a int var b interface{} //空接口 b = a
interface的多態
一種事物的多種形態,都可以按照統一的接口進行操作。這種方式是用的最多的,有點像c++中的類繼承。
例子:
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嵌套
一個接口可以嵌套在另外的接口。即需要實現2個接口的方法。在下面的例子中Used就包含了Car這個接口的所有方法。
例子:
type Car interface { NameGet() string Run(n int) Stop() } type Used interface { Car Cheap() }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。