Golang创建构造函数最佳实践

news/2023/6/7 0:14:25

构造器一般面向对象语言的典型特性,用于初始化变量。Go语言没有任何具体构造器,但我们能使用该特性去初始化变量。本文介绍不同类型构造器的差异及其应用场景。

组合字面量

组合字面量是最直接方式初始化Go对象,假设定义了Book类型,使用字面量初始化代码如下:

type Book struct {title stringpages int
}// creating a new struct instance
b := Book{}// creating a pointer to a struct instance
bp := &Book{}// creating an empty value
nothing := struct{}{}

当然还可以直接个属性赋值:

b := Book{title: "Julius Caesar",pages: 322,
}

这种方式的优势是语法直接、简单易读。但不能给每个属性设置缺省值。所以当类型包括多个缺省值字段时,需要重复写缺省值字段赋值语句。举例:

type Pizza struct {slices inttoppings []string
}somePizza := Pizza{slices: 6,toppings: []string{"pepperoni"},
}otherPizza := Pizza{slices: 6,toppings: []string{"onion", "pineapple"},
}

上面示例每次都设置slices属性为6,另外,如果toppings属性可以为空,如果没有初始化则为nil,这可能导致错误。

自定义构造函数

如果属性需要设置默认值或进行初始化,自定义构造函数可能会很有用。下面通过NewPizza构造函数定义Pizza实例:

func NewPizza(toppings []string) () {if toppings == nil {toppings = []string{}}return Pizza{slices: 6,toppings: toppings,}
}

通过使用构造函数可以自定义实例创建过程:

  1. 给字段设置缺省值,当然还可以利用可选参数方式给不同属性设置默认值。

  2. 还可以执行合理性检查,如toppings是否为nil并初始化。可以利用make或new构造一些数据类型并更好控制内存和容量。

从构造函数返回错误

当构造属性时,可能依赖其他系统或库会产生错误,这时最好返回error。

func NewRemotePizza(url string) (Pizza, error) {// toppings are received from a remote URL, which may failtoppings, err := getToppings(url)if err != nil {// if an error occurs, return the wrapped error along with an empty// Pizza instancereturn Pizza{}, fmt.Errorf("could not construct new Pizza: %v", err)}return Pizza{slices:   6,toppings: toppings,}, nil
}

返回错误有助于将故障条件封装在构造函数本身中。

interface构造函数

构造函数可以直接返回interface类型,同时在其中初始化具体类型。如果我们想将结构设为私有,同时将其初始化设为公共,这将很有帮助。

还是用Pizza类型举例,如果有bakery接口,判断pizza是否可烘烤类型。首先创建Bakeable接口,然后给Pizza类型增加isBaked字段:

// Pizza implements Bakeable
type Bakeable interface {Bake()
}type Pizza struct {slices   inttoppings []stringisBaked  bool
}func (p Pizza) Bake() {p.isBaked = true
}// this constructor will return a `Bakeable`
// and not a `Pizza`
func NewUnbakedPizza(toppings []string) Bakeable {return Pizza{slices:   6,toppings: toppings,}
}

最佳实践

让我们来看看Go中关于构造函数命名和组织的一些约定:

基本构造函数

对于简单构造函数返回类型(如Abc,或Xyz类型),则函数分别命名为NewAbc和NewXyz。对于Pizza实例,则构造函数命名为NewPizza。

主包类型

如果在给定包中,初始化变量为主包类型,可以直接命名为New(无需前缀)。举例,Pizza结构定义在pizza包中,构造函数定义如下:

package pizzatype Pizza struct {// ...
}func New(toppings []string) Pizza {// ...
}

当在其他包中调用函数时,代码为 p := pizza.New()

多个构造函数

有时相同类型可能有多个构造函数。为此,我们使用NewXyz名称的变体来描述每个方法。举例,下面有三个方法创建Pizza:

  1. NewPizza 为主构造方法.
  2. NewRemotePizza 基于远处资源的构造方法.
  3. NewUnbakedPizza 返回Bakeable接口类型的构造方法.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4561265.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

mysql案例导入_Mysql 大量数据快速导入导出【案例】

【实验背景】项目中需要对数据库中一张表进行重新设计,主要是之前未分区,考虑到数据量大了以后要设计成分区表,同时要对数据库中其他表做好备份恢复的工作。【实验环境】Mysql版本:mysql-5.6.19操作系统:Ubuntu 12.04内…

Vue进阶(九十六):VuePress 详解

佛语:“赠人玫瑰,手留余香。” 若您感觉博文内容与您有益,请点赞并收藏! 敬请关注作者,海量博文持续更新中。望与各位码友同学习,共进步! 文章目录佛语:“赠人玫瑰,手留余…

web获取gps_创建支持GPS的Web应用程序

web获取gps支持GPS的Web应用程序 常用缩略语 Ajax:异步JavaScript XML API:应用程序编程接口 DOM:文档对象模式 GPS:全球定位系统 HTML:超文本标记语言 HTTP:超文本传输​​协议 PDO:P…

我的2022年度总结

今天是腊月廿七,又到了写年度总结的时候了,这是写年度总结的第七个年头,希望可以一直坚持写下去。今年是新冠疫情的第三年,疫情管控结束了,同时疫情流行也开始了。我在北京刚全面放开的时候就阳了。用了差不多一周多的…

【非官方题解】2022牛客寒假算法基础集训营4

2022牛客寒假算法基础集训营4_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 目录 A-R B-进制 C-蓝彗星 D-雪色光晕 E-真假签到题 F-小红的记谱法 G-子序列权值乘积 H-真真真真真签到题 I-爆炸的符卡洋洋洒洒 J-区间合数的最小公倍数 K-小红的真真假假签到…

一禾九穗——禾穗精英女性成长营第一期

作者 | 寇晨编辑 | Dave 董雯雪视觉 | 任染这是 「禾穗HERS女性商学院」的第 044 篇原创如果你喜欢收听禾穗的音频,你可能会发现,我们的每一段音频开始和结束的时候合伙人都会一遍遍的重复禾穗的核心哲学——精英女性成长的沃土。我们是这样想的…

2022牛客寒假算法基础集训营 4(四) 全部题解

文章目录A R 模拟B 进制 线段树C 蓝彗星 前缀和D 雪色光晕 计算几何E 真假签到题 签到F 小红的记谱法 模拟G 子序列权值乘积 数学H 真真真真真签到题 签到I 爆炸的符卡洋洋洒洒 背包dpJ 区间合数的最小公倍数 数学K 小红的真真假假签到题题 签到L 在这冷漠的世界里光光哭哭 dp【…

JMC | 人工智能在药物合成中的当前和未来作用(2)

人工智能和机器学习已经证明了其在预测化学性质和小分子合成设计中的潜在作用。数据驱动的合成路线设计是由MLPDS(Machine Learning for Pharmaceutical Discovery and Synthesis)联盟开发和评估的一部分,该联盟包括MIT和13个化学和制药公司成员。他们一起写了“Cur…