golang中struct和interface的基礎(chǔ)使用教程
前言
本文主要給大家介紹了關(guān)于golang中struct和interface的相關(guān)內(nèi)容,是屬于golang的基本知識,下面話不多說了,來一起看看詳細(xì)的介紹吧。
struct
struct 用來自定義復(fù)雜數(shù)據(jù)結(jié)構(gòu),可以包含多個字段(屬性),可以嵌套;go中的struct類型理解為類,可以定義方法,和函數(shù)定義有些許區(qū)別;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語言中,我們可以為自定義類型定義類型相關(guān)的方法,比如:
func (p *player) Name() string{
return p.name
}
上面的代碼為player這個自定義類型聲明了一個名為Name的方法,該方法返回一個string。值得注意的是(p *player)這段代碼指定了我們是為player創(chuàng)建方法,并將調(diào)用該方法的實(shí)例指針當(dāng)作變量p傳入該函數(shù),如果沒有(p *player)這段代碼,這個方法就變成了一個普通的全局函數(shù)。
struct的嵌入(Embedding)
go語言中的“繼承”和其他語言中的繼承有很大區(qū)別,比如:
type player struct{
User
}
這是一種“繼承”的寫法,在go語言中這種方式叫做“嵌入”(embed),此時player類型就擁有了User類型的Name等變量
struct的tag
這種方式主要是用在xml,json和struct間相互轉(zhuǎn)換,非常方便直觀,比如接口給的參數(shù)一般是json傳過來,但是內(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ū)ο笏枷?,它沒有繼承,多態(tài)則完全依賴接口實(shí)現(xiàn)。golang只能模擬繼承,其本質(zhì)是組合,只不過golang語言為我們提供了一些語法糖使其看起來達(dá)到了繼承的效果。Golang中的接口,不需要顯示的實(shí)現(xiàn)。Interface類型可以定義一組方法,但是這些不需要實(shí)現(xiàn)。并且interface不能包含任何變量。只要一個變量,含有接口類型中的所有方法,那么這個變量就實(shí)現(xiàn)這個接口。因此,golang中沒有implement類似的關(guān)鍵字;如果一個變量含有了一個interface類型的多個方法,那么這個變量就實(shí)現(xiàn)了多個接口;如果一個變量只含有了一個interface的方部分方法,那么這個變量沒有實(shí)現(xiàn)這個接口。
interface的定義
interface類型默認(rèn)是一個指針。
例子:
Interface定義
type Car interface {
NameGet() string
Run(n int)
Stop()
}
空接口 Interface{}:空接口沒有任何方法,所以所有類型都實(shí)現(xiàn)了空接口。
var a int
var b interface{} //空接口
b = a
interface的多態(tài)
一種事物的多種形態(tài),都可以按照統(tǒng)一的接口進(jìn)行操作。這種方式是用的最多的,有點(diǎn)像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嵌套
一個接口可以嵌套在另外的接口。即需要實(shí)現(xiàn)2個接口的方法。在下面的例子中Used就包含了Car這個接口的所有方法。
例子:
type Car interface {
NameGet() string
Run(n int)
Stop()
}
type Used interface {
Car
Cheap()
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Go語言使用MongoDB數(shù)據(jù)庫詳細(xì)步驟
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語言使用MongoDB數(shù)據(jù)庫的詳細(xì)步驟,需要的朋友可以參考下2024-05-05
Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理
這篇文章主要介紹了Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理,iota是go語言的常量計(jì)數(shù)器,只能在常量的表達(dá)式中使用,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07
利用Go語言快速實(shí)現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng)
任務(wù)調(diào)度(Task Scheduling)是很多軟件系統(tǒng)中的重要組成部分,字面上的意思是按照一定要求分配運(yùn)行一些通常時間較長的腳本或程序。本文將利用Go語言快速實(shí)現(xiàn)一個極簡任務(wù)調(diào)度系統(tǒng),感興趣的可以了解一下2022-10-10
go語言實(shí)現(xiàn)字符串與其它類型轉(zhuǎn)換(strconv包)
strconv包是Go語言標(biāo)準(zhǔn)庫的一部分,主要提供字符串與基本數(shù)據(jù)類型之間的轉(zhuǎn)換功能,使用strconv包可以方便地在不同類型之間進(jìn)行轉(zhuǎn)換,滿足日常編程中的需求,感興趣的可以了解一下2024-10-10
Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解,需要的朋友可以參考下2022-04-04

