91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Golang可選參數實現可選模式

發布時間:2023-01-30 09:13:06 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“如何用Golang可選參數實現可選模式”,內容詳細,步驟清晰,細節處理妥當,希望這篇“如何用Golang可選參數實現可選模式”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

從需求開始

可選參數給函數傳遞額外參數擴展或修改其行為,下面示例利用可選功能創建House類型:

h := NewHouse(
  WithConcrete(),
  WithoutFireplace(),
)

NewHouse是構造函數,WithConcreteWithoutFireplace是傳入構造函數的可選參數,用于修改其返回值。下面會詳細WithConcreteWithoutFireplace可選功能函數,有時它們比正常函數參數更有用。

定義構造函數

首先定義要利用可選功能的結構體:

type House struct {
	Material     string
	HasFireplace bool
	Floors       int
}

// `NewHouse` is a constructor function for `*House`
func NewHouse() *House {
	const (
		defaultFloors       = 2
		defaultHasFireplace = true
		defaultMaterial     = "wood"
	)

	h := &House{
		Material:     defaultMaterial,
		HasFireplace: defaultHasFireplace,
		Floors:       defaultFloors,
	}

	return h
}

House可能采用不同材料,有多層,并可能包括壁爐。NewHouse構造函數返回House指針,所有屬性包括缺省值。正常情況下,首先構造House,然后根據不同需求修改屬性值。使用函數可選參數,可以給構造函數傳入一組修改器函數。

定義可選函數

首先定義函數類型,接受House類型指針:

type HouseOption func(*House)

這是可選函數的簽名,下面定義一些可選函數用于修改*House實例:

func WithConcrete() HouseOption {
	return func(h *House) {
		h.Material = "concrete"
	}
}

func WithoutFireplace() HouseOption {
	return func(h *House) {
		h.HasFireplace = false
	}
}

上面每個函數是可選構造函數,返回另一個函數,帶*House參數,沒有返回值。我們看到返回的函數修改了*House實例的屬性。還可以實現其他可選函數類型用于修改參數實例屬性,下面函數返回修改樓層的可選函數:

func WithFloors(floors int) HouseOption {
	return func(h *House) {
		h.Floors = floors
	}
}

增強構造函數

現在組合可選功能函數和構造函數:

// NewHouse now takes a slice of option as the rest arguments
func NewHouse(opts ...HouseOption) *House {
	const (
		defaultFloors       = 2
		defaultHasFireplace = true
		defaultMaterial     = "wood"
	)

	h := &House{
		Material:     defaultMaterial,
		HasFireplace: defaultHasFireplace,
		Floors:       defaultFloors,
	}

	// Loop through each option
	for _, opt := range opts {
		// Call the option giving the instantiated
		// *House as the argument
		opt(h)
	}

	// return the modified house instance
	return h
}

構造函數接受一組任意數量可選功能函數作為參數,首次初始化House屬性后,依此運行可選功能函數修改屬性值。
回到開始的示例,現在可以實現帶可選參數的構造函數調用:

h := NewHouse(
  WithConcrete(),
  WithoutFireplace(),
  WithFloors(3),
)

可選模式的優勢

上面討論了如何實現可選模式,這里總結下其優勢。

直觀清晰

相比于顯示修改對象屬性:

h := NewHouse()
h.Material = "concrete"

可利用構造函數直接實現:

h := NewHouse(WithConcrete())

采用這種方式更清晰,無需指定字符串值,避免打字錯誤并暴露*House內部細節。

支持擴展

可選模式支持擴展,總是支持不同可選函數參數傳入構造函數。舉例,既然房屋樓層可以為任何整數,我們提供具體數值作為參數傳入構造函數:

h := NewHouse(WithFloors(4))

參數順序

使用可選模式與參數順序無關,相比于正常參數有很大的靈活性;而且,可以提供任意個可選參數,相比正常參數則必須提供所有參數。

// What `NewHouse` would look like if we used
// regular function arguments
// We would always need to provide all three
// arguments no matter what
h := NewHouse("concrete", 5, true)

讀到這里,這篇“如何用Golang可選參數實現可選模式”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙阴县| 景德镇市| 淮北市| 威海市| 牟定县| 安吉县| 肥东县| 宝丰县| 泰顺县| 敦化市| 乐清市| 新疆| 隆回县| 穆棱市| 额尔古纳市| 环江| 海南省| 丰城市| 渭南市| 本溪市| 台山市| 黔南| 辽阳县| 郧西县| 宕昌县| 砀山县| 莱阳市| 应城市| 聂拉木县| 宁陕县| 左云县| 滦平县| 兰坪| 子洲县| 修武县| 沂源县| 明光市| 葵青区| 屏山县| 东阿县| 尚义县|