網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
本文討論Golang函數(shù)可選參數(shù)及函數(shù)類型,以及如何利用可選函數(shù)類型實(shí)現(xiàn)可選模式。同時(shí)通過(guò)構(gòu)造函數(shù)作為示例,實(shí)現(xiàn)強(qiáng)大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持?jǐn)U展。
從需求開(kāi)始
可選參數(shù)給函數(shù)傳遞額外參數(shù)擴(kuò)展或修改其行為,下面示例利用可選功能創(chuàng)建House類型:
h := NewHouse( WithConcrete(), WithoutFireplace(), )
NewHouse
是構(gòu)造函數(shù),WithConcrete
和WithoutFireplace
是傳入構(gòu)造函數(shù)的可選參數(shù),用于修改其返回值。下面會(huì)詳細(xì)WithConcrete
和WithoutFireplace
可選功能函數(shù),有時(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
實(shí)例:
func WithConcrete() HouseOption { return func(h *House) { h.Material = "concrete" } } func WithoutFireplace() HouseOption { return func(h *House) { h.HasFireplace = false } }
上面每個(gè)函數(shù)是可選構(gòu)造函數(shù),返回另一個(gè)函數(shù),帶*House
參數(shù),沒(méi)有返回值。我們看到返回的函數(shù)修改了*House
實(shí)例的屬性。還可以實(shí)現(xiàn)其他可選函數(shù)類型用于修改參數(shù)實(shí)例屬性,下面函數(shù)返回修改樓層的可選函數(shù):
func WithFloors(floors int) HouseOption { return func(h *House) { h.Floors = floors } }
增強(qiáng)構(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屬性后,依此運(yùn)行可選功能函數(shù)修改屬性值。
回到開(kāi)始的示例,現(xiàn)在可以實(shí)現(xiàn)帶可選參數(shù)的構(gòu)造函數(shù)調(diào)用:
h := NewHouse( WithConcrete(), WithoutFireplace(), WithFloors(3), )
可選模式的優(yōu)勢(shì)
上面討論了如何實(shí)現(xiàn)可選模式,這里總結(jié)下其優(yōu)勢(shì)。
直觀清晰
相比于顯示修改對(duì)象屬性:
h := NewHouse() h.Material = "concrete"
可利用構(gòu)造函數(shù)直接實(shí)現(xiàn):
h := NewHouse(WithConcrete())
采用這種方式更清晰,無(wú)需指定字符串值,避免打字錯(cuò)誤并暴露*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ù)順序無(wú)關(guān),相比于正常參數(shù)有很大的靈活性;而且,可以提供任意個(gè)可選參數(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)
原文鏈接:https://blog.csdn.net/neweastsun/article/details/128765027
相關(guān)推薦
- 2023-10-12 可選鏈操作符(?.)及其使用方法與場(chǎng)景
- 2022-07-18 SpringMVC文件上傳功能實(shí)現(xiàn)
- 2022-11-24 Swift?并發(fā)修改Sendable?閉包實(shí)例詳解_Swift
- 2022-09-07 pytest配置文件pytest.ini的具體使用_python
- 2022-06-10 redis?解決庫(kù)存并發(fā)問(wèn)題實(shí)現(xiàn)數(shù)量控制_Redis
- 2023-01-21 VmWare安裝Centos后配置Net網(wǎng)絡(luò)SSH鏈接問(wèn)題及解決_VMware
- 2022-08-30 Python?selenium下拉選擇框?qū)崙?zhàn)應(yīng)用例子_python
- 2023-04-29 vscode搭建python?Django網(wǎng)站開(kāi)發(fā)環(huán)境的示例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支