欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

 更新時(shí)間:2023年01月28日 14:51:10   作者:夢想畫家  
構(gòu)造器一般面向?qū)ο笳Z言的典型特性,用于初始化變量。Go語言沒有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應(yīng)用場景

組合字面量

組合字面量是最直接方式初始化Go對象,假設(shè)定義了Book類型,使用字面量初始化代碼如下:

type Book struct {
  title string
  pages int
}
// creating a new struct instance
b := Book{}
// creating a pointer to a struct instance
bp := &Book{}
// creating an empty value
nothing := struct{}{}

當(dāng)然還可以直接個(gè)屬性賦值:

b := Book{
  title: "Julius Caesar",
  pages: 322,
}

這種方式的優(yōu)勢是語法直接、簡單易讀。但不能給每個(gè)屬性設(shè)置缺省值。所以當(dāng)類型包括多個(gè)缺省值字段時(shí),需要重復(fù)寫缺省值字段賦值語句。舉例:

type Pizza struct {
  slices int
  toppings []string
}
somePizza := Pizza{
  slices: 6,
  toppings: []string{"pepperoni"},
}
otherPizza := Pizza{
  slices: 6,
  toppings: []string{"onion", "pineapple"},
}

上面示例每次都設(shè)置slices屬性為6,另外,如果toppings屬性可以為空,如果沒有初始化則為nil,這可能導(dǎo)致錯(cuò)誤。

自定義構(gòu)造函數(shù)

如果屬性需要設(shè)置默認(rèn)值或進(jìn)行初始化,自定義構(gòu)造函數(shù)可能會(huì)很有用。下面通過NewPizza構(gòu)造函數(shù)定義Pizza實(shí)例:

func NewPizza(toppings []string) () {
  if toppings == nil {
    toppings = []string{}
  }
  return Pizza{
    slices: 6,
    toppings: toppings,
  }
}

通過使用構(gòu)造函數(shù)可以自定義實(shí)例創(chuàng)建過程:

  • 給字段設(shè)置缺省值,當(dāng)然還可以利用可選參數(shù)方式給不同屬性設(shè)置默認(rèn)值。
  • 還可以執(zhí)行合理性檢查,如toppings是否為nil并初始化??梢岳胢ake或new構(gòu)造一些數(shù)據(jù)類型并更好控制內(nèi)存和容量。

從構(gòu)造函數(shù)返回錯(cuò)誤

當(dāng)構(gòu)造屬性時(shí),可能依賴其他系統(tǒng)或庫會(huì)產(chǎn)生錯(cuò)誤,這時(shí)最好返回error。

func NewRemotePizza(url string) (Pizza, error) {
  // toppings are received from a remote URL, which may fail
  toppings, err := getToppings(url)
  if err != nil {
    // if an error occurs, return the wrapped error along with an empty
    // Pizza instance
    return Pizza{}, fmt.Errorf("could not construct new Pizza: %v", err)
  }
  return Pizza{
    slices:   6,
    toppings: toppings,
  }, nil
}

返回錯(cuò)誤有助于將故障條件封裝在構(gòu)造函數(shù)本身中。

interface構(gòu)造函數(shù)

構(gòu)造函數(shù)可以直接返回interface類型,同時(shí)在其中初始化具體類型。如果我們想將結(jié)構(gòu)設(shè)為私有,同時(shí)將其初始化設(shè)為公共,這將很有幫助。

還是用Pizza類型舉例,如果有bakery接口,判斷pizza是否可烘烤類型。首先創(chuàng)建Bakeable接口,然后給Pizza類型增加isBaked字段:

// Pizza implements Bakeable
type Bakeable interface {
	Bake()
}
type Pizza struct {
	slices   int
	toppings []string
	isBaked  bool
}
func (p Pizza) Bake() {
	p.isBaked = true
}
// this constructor will return a `Bakeable`
// and not a `Pizza`
func NewUnbakedPizza(toppings []string) Bakeable {
	return Pizza{
		slices:   6,
		toppings: toppings,
	}
}

最佳實(shí)踐

讓我們來看看Go中關(guān)于構(gòu)造函數(shù)命名和組織的一些約定:

基本構(gòu)造函數(shù)

對于簡單構(gòu)造函數(shù)返回類型(如Abc,或Xyz類型),則函數(shù)分別命名為NewAbc和NewXyz。對于Pizza實(shí)例,則構(gòu)造函數(shù)命名為NewPizza。

主包類型

如果在給定包中,初始化變量為主包類型,可以直接命名為New(無需前綴)。舉例,Pizza結(jié)構(gòu)定義在pizza包中,構(gòu)造函數(shù)定義如下:

package pizza
type Pizza struct {
  // ...
}
func New(toppings []string) Pizza {
  // ...
}

當(dāng)在其他包中調(diào)用函數(shù)時(shí),代碼為 p := pizza.New() 。

多個(gè)構(gòu)造函數(shù)

有時(shí)相同類型可能有多個(gè)構(gòu)造函數(shù)。為此,我們使用NewXyz名稱的變體來描述每個(gè)方法。舉例,下面有三個(gè)方法創(chuàng)建Pizza:

  • NewPizza 為主構(gòu)造方法.
  • NewRemotePizza 基于遠(yuǎn)處資源的構(gòu)造方法.
  • NewUnbakedPizza 返回Bakeable接口類型的構(gòu)造方法.

到此這篇關(guān)于Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go創(chuàng)建構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    這篇文章主要為大家介紹了GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang值類型轉(zhuǎn)換成[]uint8類型的操作

    golang值類型轉(zhuǎn)換成[]uint8類型的操作

    這篇文章主要介紹了golang值類型轉(zhuǎn)換成[]uint8類型的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang使用cobra實(shí)現(xiàn)命令行程序的示例代碼

    Golang使用cobra實(shí)現(xiàn)命令行程序的示例代碼

    Cobra 是 Go 語言中一個(gè)強(qiáng)大的命令行應(yīng)用庫,它提供了創(chuàng)建命令行工具所需的基本結(jié)構(gòu)和功能,被許多開發(fā)者用于構(gòu)建各種命令行工具和應(yīng)用程序,本文將給大家介紹Golang使用cobra實(shí)現(xiàn)命令行程序,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • 一文帶你了解Golang中的緩沖區(qū)Buffer

    一文帶你了解Golang中的緩沖區(qū)Buffer

    作為一種常見的數(shù)據(jù)結(jié)構(gòu),緩沖區(qū)(Buffer)在計(jì)算機(jī)科學(xué)中有著廣泛的應(yīng)用。這篇文章將詳細(xì)介紹?Go?中?Buffer?的用法,從多個(gè)方面介紹其特性和應(yīng)用場景,需要的可以參考一下
    2023-05-05
  • Go語言實(shí)戰(zhàn)之切片內(nèi)存優(yōu)化

    Go語言實(shí)戰(zhàn)之切片內(nèi)存優(yōu)化

    Go 語言的切片是一個(gè)動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu),可以方便地對其進(jìn)行擴(kuò)容和縮容操作。這篇文章主要為大家詳細(xì)介紹了Go語言如何實(shí)現(xiàn)切片內(nèi)存優(yōu)化,需要的可以參考一下
    2023-03-03
  • Golang CSP并發(fā)機(jī)制及使用模型

    Golang CSP并發(fā)機(jī)制及使用模型

    這篇文章主要為大家介紹了Golang CSP并發(fā)機(jī)制及使用模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥

    golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥

    這篇文章主要給大家介紹了關(guān)于golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥的相關(guān)資料,,本文可以帶你你從零開始,一步一步的開發(fā)出這款小游戲,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • golang實(shí)現(xiàn)的文件上傳下載小工具

    golang實(shí)現(xiàn)的文件上傳下載小工具

    這篇文章主要介紹了golang實(shí)現(xiàn)的文件上傳下載小工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • go mod 使用舊版本 版本號(hào)指定方式

    go mod 使用舊版本 版本號(hào)指定方式

    這篇文章主要介紹了go mod 使用舊版本 版本號(hào)指定方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • GO實(shí)現(xiàn)協(xié)程池管理的方法

    GO實(shí)現(xiàn)協(xié)程池管理的方法

    這篇文章給大家介紹GO實(shí)現(xiàn)協(xié)程池管理的方法,分別使用channel實(shí)現(xiàn)協(xié)程池和消費(fèi)者模式實(shí)現(xiàn)協(xié)程池,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07

最新評論