日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang創建構造函數的方法超詳細講解_Golang

作者:夢想畫家 ? 更新時間: 2023-03-22 編程語言

組合字面量

組合字面量是最直接方式初始化Go對象,假設定義了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{}{}

當然還可以直接個屬性賦值:

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

這種方式的優勢是語法直接、簡單易讀。但不能給每個屬性設置缺省值。所以當類型包括多個缺省值字段時,需要重復寫缺省值字段賦值語句。舉例:

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

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

自定義構造函數

如果屬性需要設置默認值或進行初始化,自定義構造函數可能會很有用。下面通過NewPizza構造函數定義Pizza實例:

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

通過使用構造函數可以自定義實例創建過程:

  • 給字段設置缺省值,當然還可以利用可選參數方式給不同屬性設置默認值。
  • 還可以執行合理性檢查,如toppings是否為nil并初始化。可以利用make或new構造一些數據類型并更好控制內存和容量。

從構造函數返回錯誤

當構造屬性時,可能依賴其他系統或庫會產生錯誤,這時最好返回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
}

返回錯誤有助于將故障條件封裝在構造函數本身中。

interface構造函數

構造函數可以直接返回interface類型,同時在其中初始化具體類型。如果我們想將結構設為私有,同時將其初始化設為公共,這將很有幫助。

還是用Pizza類型舉例,如果有bakery接口,判斷pizza是否可烘烤類型。首先創建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,
	}
}

最佳實踐

讓我們來看看Go中關于構造函數命名和組織的一些約定:

基本構造函數

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

主包類型

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

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

當在其他包中調用函數時,代碼為 p := pizza.New()

多個構造函數

有時相同類型可能有多個構造函數。為此,我們使用NewXyz名稱的變體來描述每個方法。舉例,下面有三個方法創建Pizza:

  • NewPizza 為主構造方法.
  • NewRemotePizza 基于遠處資源的構造方法.
  • NewUnbakedPizza 返回Bakeable接口類型的構造方法.

原文鏈接:https://blog.csdn.net/neweastsun/article/details/128735556

欄目分類
最近更新