golang方法参数的封装

假如有一个对象,下面有个方法需要对很多参数做一些处理,这些参数可以由开发者自定传参,可传可不传,可传一也可传多,一般这种信息有时是不重要的,但是实际中不能缺少。
如果是对于使用者而言,参数多也很正常,但是对于第三方库的开发者来说,代码太丑了,那么就需要封装一下。

假如不封装你会这样一个一个的传,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}}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 基于golang的直播平台项目源码+项目说明.zip 开始livego项目之前,有些必备的基础需要搞清楚。 > 启动rtmps服务时候的证书和密钥是什么? 启动rtmps服务时,先从配置文件中获取了证书和密钥的路径,然后使用 tls.LoadX509KeyPair 函数加载证书和密钥。 证书和密钥是用于加密和解密数据传输的,通常以文件的形式存储在磁盘上。 证书和密钥的`生成`通常需要使用`证书颁发机构(CA)`或`自签名证书`。如果你使用的是自签名证书,那么你需要手动创建证书和密钥。你可以使用 OpenSSL 工具来生成自签名证书和密钥。具体的生成方法可以参考 OpenSSL 的官方文档。如果你使用的是 CA 颁发的证书,那么你需要向 CA 申请证书和密钥。申请的具体方法可以参考 CA 的官方文档。 > hlsServer与rtmpServer是什么关系? hlsServer 和 rtmpServer 是两个不同的服务。 hlsServer 监听指定的地址和端口,接收客户端的 HLS 请求,并将 RTMP 流转换为 HLS 流进行传输。rtmpServer 监听指定的地址和端口,接收客户端的 RTMP 请求,并将音视频流传输给客户端。 在 livego 代码中,如果 hlsServer 不为 nil,则会将 hlsServer 作为参数传递给 rtmpServer,这样 rtmpServer 就可以将 RTMP 流转换为 HLS 流进行传输。如果 hlsServer 为 nil,则说明 HLS 服务被禁用,此时 rtmpServer 只能将音视频流传输给客户端,不能进行转换。 > RTMP流和HLS流有什么区别?二者不都是二进制吗? RTMP 和 HLS 都是用于`音视频流传输的协议`,但它们之间存在一些区别。 `RTMP 是基于 TCP 的应用层协议`,它将音视频流封装成二进制数据包进行传输。RTMP 支持实时传输,延迟较低,但对网络带宽和稳定性要求较高。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值