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

 更新时间:2023年01月28日 14:51:10   作者:梦想画家  
构造器一般面向对象语言的典型特性,用于初始化变量。Go语言没有任何具体构造器,但我们能使用该特性去初始化变量。本文介绍不同类型构造器的差异及其应用场景
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

组合字面量

组合字面量是最直接方式初始化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创建构造函数的方法超详细讲解的文章就介绍到这了,更多相关Go创建构造函数内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 如何使用proto组件编译pb.go文件

    如何使用proto组件编译pb.go文件

    这篇文章主要介绍了如何使用proto组件编译pb.go文件的详细过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 一步步教你打造高效可靠的Go库

    一步步教你打造高效可靠的Go库

    这篇文章主要介绍了一步步教你打造高效可靠的Go库的相关资料,需要的朋友可以参考下
    2023-11-11
  • 深入理解Go语言中接口的使用

    深入理解Go语言中接口的使用

    在现代编程语言中,接口是不可或缺的一个重要特性,这篇文章将为大家详细介绍Go语言中的接口,从而能够更好得使用Go语言,需要的可以参考一下
    2023-06-06
  • Go语言面试题之select和channel的用法

    Go语言面试题之select和channel的用法

    金九银十面试季到了(PS:貌似今年一年都是面试季),就业环境很差,导致从业人员不得不卷。本文将重点讲解一下Go面试进阶知识点之select和channel,需要的可以参考一下
    2022-09-09
  • golang API请求队列的实现

    golang API请求队列的实现

    本文主要介绍了golang API请求队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Go?CSV包实现结构体和csv内容互转工具详解

    Go?CSV包实现结构体和csv内容互转工具详解

    这篇文章主要介绍了Go?CSV包实现结构体和csv内容互转工具详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 利用go语言实现Git?重命名远程分支??

    利用go语言实现Git?重命名远程分支??

    这篇文章主要介绍了go语言实现Git?重命名远程分支,文章基于go语言的基础展开Git?重命名远程分支的实现过程,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-06-06
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解

    这篇文章主要为大家介绍了Go语言数据结构之希尔排序示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • go语言中读取配置文件的方法总结

    go语言中读取配置文件的方法总结

    这篇文章主要为大家详细介绍了go语言中读取配置文件的几个常见方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考下
    2023-08-08
  • Golang算法问题之数组按指定规则排序的方法分析

    Golang算法问题之数组按指定规则排序的方法分析

    这篇文章主要介绍了Golang算法问题之数组按指定规则排序的方法,结合实例形式分析了Go语言数组排序相关算法原理与操作技巧,需要的朋友可以参考下
    2017-02-02

最新评论

?


http://www.vxiaotou.com