假如有一个对象,下面有个方法需要对很多参数做一些处理,这些参数可以由开发者自定传参,可传可不传,可传一也可传多,一般这种信息有时是不重要的,但是实际中不能缺少。
如果是对于使用者而言,参数多也很正常,但是对于第三方库的开发者来说,代码太丑了,那么就需要封装一下。
假如不封装你会这样一个一个的传,Parameter 参数越多,方法的形参越多
package main
import "fmt"
// Book 书的主要信息
type Book struct {
BookPrice int //价格
Author string //作者
BookName string //书名
Parameter
}
// Parameter 书的一些其他信息
type Parameter struct {
Press string // 出版社
PublicationTime string // 出版时间
PrintingHouse string // 印刷厂
NumberOfWords uint64 //字数
}
// 形参很多
func (b *Book) AddBookInfos(BookPrice int, Author, BookName, Press, PublicationTime, PrintingHouse string, NumberOfWords uint64) {
b.BookPrice = BookPrice
b.Author = Author
b.BookName = BookName
b.Parameter.Press = Press
b.Parameter.PublicationTime = PublicationTime
fmt.Println(b)
}
// 调用
func main() {
var book Book
book.AddBookInfos(99, "张三", "时间简史", "北京出版社", "2008.06.08", "钢铁印刷厂", 96564)
}
/* 结果
&{99 张三 时间简史 {北京出版社 2008.06.08 钢铁印刷厂 96564}}
*/
稍微封装亿点点之后,自由度就高了,想修改哪个参数就传哪个,当然也可以传多个
package main
import "fmt"
// Book 书的主要信息
type Book struct {
BookPrice int //价格
Author string //作者
BookName string //书名
Parameter
}
// Parameter 书的一些其他信息
type Parameter struct {
Press string // 出版社
PublicationTime string // 出版时间
PrintingHouse string // 印刷厂
NumberOfWords uint64 //字数
}
type BookOptions func(*Book)
func encapsulationPress(press string) BookOptions {
return func(book *Book) {
book.Parameter.Press = press
}
}
func encapsulationPublicationTime(publicationTime string) BookOptions {
return func(book *Book) {
book.Parameter.PublicationTime = publicationTime
}
}
func encapsulationPrintingHouse(printingHouse string) BookOptions {
return func(book *Book) {
book.Parameter.PrintingHouse = printingHouse
}
}
func encapsulationNumberOfWords(numberOfWords uint64) BookOptions {
return func(book *Book) {
book.Parameter.NumberOfWords = numberOfWords
}
}
func (b *Book) AddBookInfo(BookPrice int, Author, BookName string, options ...BookOptions) {
b.BookPrice = BookPrice
b.Author = Author
b.BookName = BookName
for _, option := range options {
option(b)
}
fmt.Println(b)
}
// 调用
func main() {
var book Book
book.AddBookInfo(99, "张三", "时间简史", encapsulationPress("清华大学出版社"))
// book.AddBookInfo(99, "张三", "时间简史", encapsulationNumberOfWords(66894454654))
// book.AddBookInfo(99, "张三", "时间简史", encapsulationPublicationTime("2022.08.01"))
}
/*结果
&{99 张三 时间简史 {清华大学出版社 0}}
// &{99 张三 时间简史 { 66894454654}}
// &{99 张三 时间简史 { 2022.08.01 0}}
*/