Skip to content

Latest commit

 

History

History
36 lines (28 loc) · 1.16 KB

functional_options.md

File metadata and controls

36 lines (28 loc) · 1.16 KB

当我们定义了一个对象时,一般会创建一个方法方便外部初始化一个实例。

在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了.

下面简绍一种优雅的方案:Functional Options
1.在 file/options.go 中定义了 Options 的 struct。
2.在 file/new.go 中定义了 New(filepath string, setters ...Option) 方法
3.main.go 中有示例代码

注意 file/new.go 内部实现, 首先使用默认值创建一个 Options,之后 使用 setters 循环修改设置项。

package file

func New(filepath string, setters ...Option) (*os.File, error) {
	// Default Options
	args := &Options{
		UID:         os.Getuid(),
		GID:         os.Getgid(),
		Contents:    "",
		Permissions: 0666,
		Flags:       os.O_CREATE | os.O_EXCL | os.O_WRONLY,
	}

	for _, setter := range setters {
		setter(args)
	}

	...
}

通过 Functional Options 的接口设计,即使在之后添加设置项,我们只需要修改很少的代码即可。