Golang创建构造函数的方法超详细讲解
作者:梦想画家 发布时间:2024-05-08 10:15:27
组合字面量
组合字面量是最直接方式初始化Go对象,假设定义了Book类型,使用字面量初始化代码如下:
type Book struct {
title string
pages 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 int
toppings []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,
}
}
通过使用构造函数可以自定义实例创建过程:
给字段设置缺省值,当然还可以利用可选参数方式给不同属性设置默认值。
还可以执行合理性检查,如toppings是否为nil并初始化。可以利用make或new构造一些数据类型并更好控制内存和容量。
从构造函数返回错误
当构造属性时,可能依赖其他系统或库会产生错误,这时最好返回error。
func NewRemotePizza(url string) (Pizza, error) {
// toppings are received from a remote URL, which may fail
toppings, err := getToppings(url)
if err != nil {
// if an error occurs, return the wrapped error along with an empty
// Pizza instance
return 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 int
toppings []string
isBaked 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 pizza
type Pizza struct {
// ...
}
func New(toppings []string) Pizza {
// ...
}
当在其他包中调用函数时,代码为 p := pizza.New()
。
多个构造函数
有时相同类型可能有多个构造函数。为此,我们使用NewXyz名称的变体来描述每个方法。举例,下面有三个方法创建Pizza:
NewPizza 为主构造方法.
NewRemotePizza 基于远处资源的构造方法.
NewUnbakedPizza 返回Bakeable接口类型的构造方法.
来源:https://blog.csdn.net/neweastsun/article/details/128735556


猜你喜欢
- aspjpeg组件官方下载地址:http://www.persits.com/说明: 1、aspjpeg能对图片水印进行透明度调整
- 摘录 – Parse JavaScript SDK现在提供了支持大多数异步方法的兼容jquery的Promises模式,那么这意味着什么呢,
- 一、85%的广告没人看解读:如何挤进那15%的成功广告中去,吸引了读者就是成功了一半。Quester视角:反过来讲,只有不到1/5的广告能吸
- 1.python 和 pytorch的数据类型区别在PyTorch中无法展示字符串,因此表达字符串,需要将其转换成编码的类型,比如one_h
- 1、算数运算符小例中: a = 5 &nb
- 1. 递归概述递归( recursion)是一种编程技巧,某些情况下,甚至是无可替代的技巧。递归可以大幅简化代码,看起来非常简洁,但递归设计
- 前言这篇博客将了解什么是特征,角点,哈里斯角点检测(Harris Corner Detection)的概念。并使用cv2.cornerHar
- MySQL5.7及以上版本提供直接查询冗余索引、重复索引和未使用过索引的视图,直接查询即可。查询冗余索引、重复索引select * sys.
- 打开sqlserver时提示评估期已过解决方法:打开sqlserver安装中心(注意:选择R2的安装中心)选择版本升级中途可能会出现需要重启
- 使用echart卡在引入包的问题上了。到github下载的js一直引入不了。注意是引入dirt文件夹下的echarts.js把这个文件夹放入
- 0 前言安装:pip install pypiwin32 1 Excel的APIimport win32com.client as win3
- 主要有以下步骤:1、人脸检测2、人脸预处理3、从收集的人脸训练机器学习算法4、人脸识别5、收尾工作人脸检测算法:基于Haar的脸部检测器的基
- optimizer.param_groups: 是长度为2的list,其中的元素是2个字典;optimizer.param_groups[0
- pycharm sql语句警告产生原因为没有配置数据库,配置数据库,似乎没什么作用那么,直接去掉他的警告提示找到setting->ed
- 将解压文件放置C盘配置环境变量 Patch:C:\mysql-5.7.25-winx64\bin;安装mysql切换到bin目录 cd C:
- 每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。 举个例子,在这行URLConf中:(r'^artic
- Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的。如果您不熟悉正规表达式,那么这篇文章可以让
- 作者:AngelGavin 出处:CSDN一般问题什么是 XML?可扩展标记语言 (XML) 是 Web 上的数据通用语言。它使
- 本文向大家分享23种JavaScript提高执行效率的小技巧、最佳实践等非常实用的内容。当然JavaScript的实用技巧不止这些,还有很多
- 今天继续学习Django,今天主要掌握两个小点一、如果为Django项目中引入静态文件1、先要在project目录下创建static的目录,