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

教你利用Golang可選參數(shù)實現(xiàn)可選模式

 更新時間:2023年01月28日 16:02:24   作者:夢想畫家  
本文討論Golang函數(shù)可選參數(shù)及函數(shù)類型,以及如何利用可選函數(shù)類型實現(xiàn)可選模式。同時通過構(gòu)造函數(shù)作為示例,實現(xiàn)強大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持?jǐn)U展

本文討論Golang函數(shù)可選參數(shù)及函數(shù)類型,以及如何利用可選函數(shù)類型實現(xiàn)可選模式。同時通過構(gòu)造函數(shù)作為示例,實現(xiàn)強大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持?jǐn)U展。

從需求開始

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

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

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

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

首先定義要利用可選功能的結(jié)構(gòu)體:

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構(gòu)造函數(shù)返回House指針,所有屬性包括缺省值。正常情況下,首先構(gòu)造House,然后根據(jù)不同需求修改屬性值。使用函數(shù)可選參數(shù),可以給構(gòu)造函數(shù)傳入一組修改器函數(shù)。

定義可選函數(shù)

首先定義函數(shù)類型,接受House類型指針:

type HouseOption func(*House)

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

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

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

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

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

增強構(gòu)造函數(shù)

現(xiàn)在組合可選功能函數(shù)和構(gòu)造函數(shù):

// 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
}

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

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

可選模式的優(yōu)勢

上面討論了如何實現(xiàn)可選模式,這里總結(jié)下其優(yōu)勢。

直觀清晰

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

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

可利用構(gòu)造函數(shù)直接實現(xiàn):

h := NewHouse(WithConcrete())

采用這種方式更清晰,無需指定字符串值,避免打字錯誤并暴露*House內(nèi)部細(xì)節(jié)。

支持?jǐn)U展

可選模式支持?jǐn)U展,總是支持不同可選函數(shù)參數(shù)傳入構(gòu)造函數(shù)。舉例,既然房屋樓層可以為任何整數(shù),我們提供具體數(shù)值作為參數(shù)傳入構(gòu)造函數(shù):

h := NewHouse(WithFloors(4))

參數(shù)順序

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

// 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)

到此這篇關(guān)于利用Golang可選參數(shù)實現(xiàn)可選模式的文章就介紹到這了,更多相關(guān)Golang可選參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你搞懂Go如何讀寫Excel文件

    一文帶你搞懂Go如何讀寫Excel文件

    Excelize是一個用純Go語言編寫的庫,提供了一組函數(shù),可以對XLAM?/?XLSM?/?XLSX?/?XLTM?/?XLTX文件進行讀寫。支持讀寫由Microsoft?Excel?2007及以后版本生成的電子表格文檔。本文就將用它實現(xiàn)讀寫Excel文件操作,感興趣的可以學(xué)習(xí)一下
    2022-11-11
  • 關(guān)于golang類型推斷和變量重聲明詳解

    關(guān)于golang類型推斷和變量重聲明詳解

    在Go語言中,類型推斷可以根據(jù)變量的初始化值自動推斷出變量的類型,而不需要顯式地聲明變量類型,變量重聲明可以在同一作用域內(nèi)重復(fù)聲明一個變量,只要其中至少一個是新的變量,本就簡單的給大家介紹一下golang類型推斷和變量重聲明,需要的朋友可以參考下
    2023-08-08
  • Go語言Seeker接口與文件斷點續(xù)傳實戰(zhàn)教程

    Go語言Seeker接口與文件斷點續(xù)傳實戰(zhàn)教程

    Go語言的io包中Seeker接口為大文件處理或需要隨機訪問的場景提供了強大的支持,本文通過具體案例詳細(xì)介紹了Seeker接口的應(yīng)用,包括隨機訪問大文件、斷點續(xù)傳等場景,以及如何使用Seeker接口進行有效的文件讀寫操作
    2024-10-10
  • go判斷文件夾是否存在并創(chuàng)建的實例

    go判斷文件夾是否存在并創(chuàng)建的實例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang-gorm自動建表問題

    golang-gorm自動建表問題

    這篇文章主要介紹了golang-gorm自動建表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 對Go語言中的context包源碼分析

    對Go語言中的context包源碼分析

    這篇文章主要對Go語言中的context包源碼進行分析,context包析是1.15,context包定義了一個Context類型過這個Context接口類型,?就可以跨api邊界/跨進程傳遞一些值,下面我們就來對context包源碼進行分析,需要的小伙伴可以參考一下
    2022-02-02
  • Go語言中使用反射的方法

    Go語言中使用反射的方法

    這篇文章主要介紹了Go語言中使用反射的方法,實例分析了Go語言實現(xiàn)反射的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 淺析Go匯編語法和MatrixOne使用介紹

    淺析Go匯編語法和MatrixOne使用介紹

    MatrixOne由Go語言所開發(fā)是一個新一代超融合異構(gòu)數(shù)據(jù)庫,致力于打造單一架構(gòu)處理TP、AP、流計算等多種負(fù)載的極簡大數(shù)據(jù)引擎,今天通過本文給大家介紹Go匯編語法和MatrixOne使用,感興趣的朋友一起看看吧
    2022-04-04
  • Gin使用swagger生成接口文檔的代碼示例

    Gin使用swagger生成接口文檔的代碼示例

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful Web 服務(wù),它使用 YAML 或 JSON 格式來定義 API 的結(jié)構(gòu),本文給大家介紹了Gin使用swagger生成接口文檔的代碼示例,需要的朋友可以參考下
    2024-06-06
  • Go語言生成隨機數(shù)的方法

    Go語言生成隨機數(shù)的方法

    這篇文章主要介紹了Go語言生成隨機數(shù)的方法,實例分析了Go語言生成隨機數(shù)的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論