阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Golang创建构造函数的方法详解

275次阅读
没有评论

共计 2254 个字符,预计需要花费 6 分钟才能阅读完成。

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

组合字面量是最直接方式初始化 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 接口类型的构造方法.
  • 到此这篇关于 Golang 创建构造函数的方法超详细讲解的文章就介绍到这了

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥玩云-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2254字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

    星哥玩云

    星哥玩云
    星哥玩云
    分享互联网知识
    用户数
    4
    文章数
    19348
    评论数
    4
    阅读量
    7801937
    文章搜索
    热门文章
    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
    云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

    云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

    云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
    我把用了20年的360安全卫士卸载了

    我把用了20年的360安全卫士卸载了

    我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
    阿里云CDN
    阿里云CDN-提高用户访问的响应速度和成功率
    随机文章
    飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

    飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

    飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
    开源神器组合!1Panel面板+Halo助你轻松打造个人/企业内容中心

    开源神器组合!1Panel面板+Halo助你轻松打造个人/企业内容中心

    开源神器组合!1Panel 面板 +Halo 助你轻松打造个人 / 企业内容中心 前言 大家好,我是星哥,之前...
    恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

    恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

    恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
    星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

    星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

      星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
    150元打造低成本NAS小钢炮,捡一块3865U工控板

    150元打造低成本NAS小钢炮,捡一块3865U工控板

    150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...

    免费图片视频管理工具让灵感库告别混乱

    一言一句话
    -「
    手气不错
    150元打造低成本NAS小钢炮,捡一块3865U工控板

    150元打造低成本NAS小钢炮,捡一块3865U工控板

    150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
    如何免费使用强大的Nano Banana Pro?附赠邪修的用法

    如何免费使用强大的Nano Banana Pro?附赠邪修的用法

    如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
    星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

    星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

    星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
    240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

    240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

      240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
    每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

    每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

    每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...