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

教你利用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ù),讓代碼更直觀、靈活、支持擴展

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

從需求開始

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

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

NewHouse是構(gòu)造函數(shù),WithConcreteWithoutFireplace是傳入構(gòu)造函數(shù)的可選參數(shù),用于修改其返回值。下面會詳細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)部細節(jié)。

支持擴展

可選模式支持擴展,總是支持不同可選函數(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語言中net/http包的使用

    詳解Go語言中net/http包的使用

    Go語言內(nèi)置的?net/http?包十分的優(yōu)秀,提供了HTTP客戶端和服務(wù)端的實現(xiàn),本文主要就來和大家聊聊net/http包的使用,感興趣的可以了解一下
    2023-07-07
  • golang struct擴展函數(shù)參數(shù)命名警告解決方法

    golang struct擴展函數(shù)參數(shù)命名警告解決方法

    今天在使用VSCode編寫golang代碼時,定義一個struct,擴展幾個方法,需要的朋友可以參考下
    2017-02-02
  • Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解

    Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解

    在Golang中,大家必然會頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學可能并沒有注意過函數(shù)和方法的異同點,函數(shù)和方法都是用來執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細講解函數(shù)和方法的定義以及它們的異同點
    2023-07-07
  • Golang實現(xiàn)Trie(前綴樹)的示例

    Golang實現(xiàn)Trie(前綴樹)的示例

    本文主要介紹了Golang實現(xiàn)Trie(前綴樹)的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Gin+Gorm實現(xiàn)增刪改查的示例代碼

    Gin+Gorm實現(xiàn)增刪改查的示例代碼

    本文介紹了如何使用Gin和Gorm框架實現(xiàn)一個簡單的增刪改查(CRUD)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • Golang的os標準庫中常用函數(shù)的整理介紹

    Golang的os標準庫中常用函數(shù)的整理介紹

    這篇文章主要介紹了Go語言的os標準庫中常用函數(shù),主要用來實現(xiàn)與操作系統(tǒng)的交互功能,需要的朋友可以參考下
    2015-10-10
  • Golang中HttpRouter路由的使用詳解

    Golang中HttpRouter路由的使用詳解

    httprouter?是一個高性能、可擴展的HTTP路由,本文將通過一些簡單的示例為大家講講httprouter?這個強大的?HTTP?路由是如何使用的,感興趣的小伙伴可以了解一下
    2023-05-05
  • Go庫text與template包使用示例詳解

    Go庫text與template包使用示例詳解

    這篇文章主要為大家介紹了Go庫text與template包使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解Golang使用MongoDB通用操作

    詳解Golang使用MongoDB通用操作

    這篇文章主要介紹了詳解Golang使用MongoDB通用操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Go語言中Map的神奇操作小結(jié)

    Go語言中Map的神奇操作小結(jié)

    Map是一個強大而又有趣的工具,它可以幫助我們高效地存儲和操作鍵值對數(shù)據(jù),本文主要介紹了Go語言中Map的各種操作,包括增加、查找、刪除、遍歷等,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論

汾阳市| 安国市| 体育| 古蔺县| 繁峙县| 永春县| 山阳县| 丁青县| 宕昌县| 扎兰屯市| 旌德县| 绥化市| 瑞金市| 穆棱市| 闻喜县| 怀仁县| 横山县| 巴中市| 舞钢市| 永泰县| 香河县| 腾冲县| 湘潭市| 铁力市| 巧家县| 泸溪县| 嘉定区| 车险| 隆子县| 桐乡市| 高尔夫| 德阳市| 黄冈市| 临汾市| 昭平县| 保德县| 永川市| 河东区| 武穴市| 合阳县| 丽水市|