内容简介:[TOC]201808构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
[TOC]
Golang面向对象编程之构造函数【struct&new】
201808
构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
Golang里面没有构造函数,但是Golang却可以像C++一样实现类似继承、构造函数一样等面向对象编程的思想和方法。Golang里面要实现相关的构造函数定义可以通过通过new来创建构造函数。
一个简单的构造函数的实现
定义一个结构
type ContentMsg struct { EffectId int `json:"effect_id"` Text string `json:"text"` Data interface{} `json: "data"` }
通过new一个对象,或者利用Golang本身的&方式来生成一个对象并返回一个对象指针:
unc NewContentMsg(data, effectId int) *ContentMsg { instance := new(ContentMsg) instance.Data = data instance.EffectId = effectId return instance } func NewContentMsgV2(data, effectId int) *ContentMsg { return &ContentMsg{ Data: data, EffectId: effectId, } }
更为优雅的构造的函数的实现
/* 一个更为优雅的构造函数的实现方式 参考: * 1,项目:"gitlab.xxx.com/xxx/redis" * 2,链接:https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html 通过这个方式可以方便构造不同对象,同时避免了大量重复代码 */ package main import ( "fmt" "time" "golang.org/x/net/context" ) type Cluster struct { opts options } type options struct { connectionTimeout time.Duration readTimeout time.Duration writeTimeout time.Duration logError func(ctx context.Context, err error) } // 通过一个选项实现为一个函数指针来达到一个目的:设置选项中的数据的状态 // Golang函数指针的用法 type Option func(c *options) // 设置某个参数的一个具体实现,用到了闭包的用法。 // 不仅仅只是设置而采用闭包的目的是为了更为优化,更好用,对用户更友好 func LogError(f func(ctx context.Context, err error)) Option { return func(opts *options) { opts.logError = f } } func ConnectionTimeout(d time.Duration) Option { return func(opts *options) { opts.connectionTimeout = d } } func WriteTimeout(d time.Duration) Option { return func(opts *options) { opts.writeTimeout = d } } func ReadTimeout(d time.Duration) Option { return func(opts *options) { opts.readTimeout = d } } // 构造函数具体实现,传入相关Option,new一个对象并赋值 // 如果参数很多,也不需要传入很多参数,只需要传入opts ...Option即可 func NewCluster(opts ...Option) *Cluster { clusterOpts := options{} for _, opt := range opts { // 函数指针的赋值调用 opt(&clusterOpts) } cluster := new(Cluster) cluster.opts = clusterOpts return cluster } func main() { // 前期储备,设定相关参数 commonsOpts := []Option{ ConnectionTimeout(1 * time.Second), ReadTimeout(2 * time.Second), WriteTimeout(3 * time.Second), LogError(func(ctx context.Context, err error) { }), } // 终极操作,构造函数 cluster := NewCluster(commonsOpts...) // 测试验证 fmt.Println(cluster.opts.connectionTimeout) fmt.Println(cluster.opts.writeTimeout) }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java构造函数与普通函数用法详解
- 构造函数、原型、原型链、继承
- Vue源码: 构造函数入口
- Hashmap源码解析-构造函数
- JavaScript 构造函数的继承
- Swift学习之构造函数与析构函数
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
测试驱动开发的艺术
Lasse Koskela / 李贝 / 人民邮电出版社 / 20101023 / 59.00元
在传统的软件开发中,开发人员对于代码是否正确心中无底,一切依赖于后期的测试环节。极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。 本书采用“手把手”的教学方式,通过大量实例来解释TDD,还专门用几章的篇幅来讲解如何为难于测试的技术编写单元测试。全书内容循......一起来看看 《测试驱动开发的艺术》 这本书的介绍吧!