最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中struct和interface的基礎(chǔ)使用教程

 更新時(shí)間:2018年03月25日 11:27:15   作者:helight  
Go不同于一般的面向?qū)ο笳Z(yǔ)言,需要我們好好的學(xué)習(xí)研究,下面這篇文章主要給大家介紹了關(guān)于golang中struct和interface的基礎(chǔ)使用的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家介紹了關(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)文章

  • go中import包的大坑解決方案

    go中import包的大坑解決方案

    最近開(kāi)始使用Go/GoLand 在import 自定義包時(shí)出現(xiàn)各種狀況,本文就介紹一下go中import包的大坑解決方案,具有一定的參考價(jià)值,感興趣 可以了解一下
    2022-06-06
  • golang配制高性能sql.DB的使用

    golang配制高性能sql.DB的使用

    本文主要講述SetMaxOpenConns(),?SetMaxIdleConns()?和?SetConnMaxLifetime()方法,?您可以使用它們來(lái)配置sql.DB的行為并改變其性能,感興趣的可以了解一下
    2021-12-12
  • 淺談Golang內(nèi)存逃逸

    淺談Golang內(nèi)存逃逸

    本文主要介紹了Golang內(nèi)存逃逸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Go語(yǔ)言使用MongoDB數(shù)據(jù)庫(kù)詳細(xì)步驟

    Go語(yǔ)言使用MongoDB數(shù)據(jù)庫(kù)詳細(xì)步驟

    mongodb是一種高性能、開(kāi)源、文檔型的nosql數(shù)據(jù)庫(kù),被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言使用MongoDB數(shù)據(jù)庫(kù)的詳細(xì)步驟,需要的朋友可以參考下
    2024-05-05
  • Go?iota關(guān)鍵字與枚舉類(lèi)型實(shí)現(xiàn)原理

    Go?iota關(guān)鍵字與枚舉類(lèi)型實(shí)現(xiàn)原理

    這篇文章主要介紹了Go?iota關(guān)鍵字與枚舉類(lèi)型實(shí)現(xiàn)原理,iota是go語(yǔ)言的常量計(jì)數(shù)器,只能在常量的表達(dá)式中使用,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • 利用Go語(yǔ)言快速實(shí)現(xiàn)一個(gè)極簡(jiǎn)任務(wù)調(diào)度系統(tǒng)

    利用Go語(yǔ)言快速實(shí)現(xiàn)一個(gè)極簡(jiǎn)任務(wù)調(diào)度系統(tǒng)

    任務(wù)調(diào)度(Task Scheduling)是很多軟件系統(tǒng)中的重要組成部分,字面上的意思是按照一定要求分配運(yùn)行一些通常時(shí)間較長(zhǎng)的腳本或程序。本文將利用Go語(yǔ)言快速實(shí)現(xiàn)一個(gè)極簡(jiǎn)任務(wù)調(diào)度系統(tǒng),感興趣的可以了解一下
    2022-10-10
  • 使用Golang編寫(xiě)一個(gè)簡(jiǎn)單的命令行工具

    使用Golang編寫(xiě)一個(gè)簡(jiǎn)單的命令行工具

    Cobra是一個(gè)強(qiáng)大的開(kāi)源工具,能夠幫助我們快速構(gòu)建出優(yōu)雅且功能豐富的命令行應(yīng)用,本文將利用Cobra編寫(xiě)一個(gè)簡(jiǎn)單的命令行工具,感興趣的可以了解下
    2023-12-12
  • GO語(yǔ)言函數(shù)(func)的聲明與使用詳解

    GO語(yǔ)言函數(shù)(func)的聲明與使用詳解

    這篇文章主要介紹了GO函數(shù)(func)的聲明與使用,包括了GO語(yǔ)言函數(shù)聲明與使用,GO語(yǔ)言遞歸函數(shù),GO語(yǔ)言?xún)?nèi)置函數(shù),GO語(yǔ)言函數(shù)defer應(yīng)用,GO語(yǔ)言函數(shù)可變長(zhǎng)度參數(shù)需要的朋友可以參考下
    2022-12-12
  • go語(yǔ)言實(shí)現(xiàn)字符串與其它類(lèi)型轉(zhuǎn)換(strconv包)

    go語(yǔ)言實(shí)現(xiàn)字符串與其它類(lèi)型轉(zhuǎn)換(strconv包)

    strconv包是Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)的一部分,主要提供字符串與基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換功能,使用strconv包可以方便地在不同類(lèi)型之間進(jìn)行轉(zhuǎn)換,滿(mǎn)足日常編程中的需求,感興趣的可以了解一下
    2024-10-10
  • Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解

    Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之回調(diào)函數(shù)和閉包詳解,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

吉安市| 汕尾市| 晴隆县| 宝丰县| 广东省| 九龙坡区| 江西省| 新乐市| 襄樊市| 滨海县| 铁岭市| 兴隆县| 马关县| 鱼台县| 湘西| 应用必备| 浪卡子县| 布拖县| 峨眉山市| 连城县| 宁蒗| 丘北县| 武平县| 高安市| 大城县| 文登市| 九龙城区| 永丰县| 襄垣县| 广丰县| 芷江| 墨竹工卡县| 阿克| 湖州市| 改则县| 拜城县| 石景山区| 日照市| 桑日县| 密云县| 双城市|