专栏首页Linux 服务端系统研发Golang面向对象编程之构造函数【struct&new】

Golang面向对象编程之构造函数【struct&new】

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)

}

本文分享自微信公众号 - Linux 服务端系统研发(gh_cc58aae5b7f1),作者:AllenWu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【读后总结】程序员修炼之道---从小工到专家

    本书相对比较基础,不是那种大规模程序设计、高并发设计等等,主要是针对程序员的一些基本素质和一些基本常规编程设计做一些梳理和规范,对于初入职的程序员,养成这些良好...

    Allen.Wu
  • Wireshark分析艺术【读书总结】

    【统计->捕获文件属性】 Statistics -> Summary,查看文件属性信息,如平均速度、包大小、包数等等

    Allen.Wu
  • 如何评估、预测系统的QPS

    当我们在设计一套系统的时候,我们要考虑好系统的架构设计、模块划分、技术方案选型、还有系统性能如能够承受的QPS。当我们线上系统能够支撑10W QPS的时候,我们...

    Allen.Wu
  • 【作者投稿】奇葩webshell技巧

    前段时间看XDCTF的一道web题,发现了一种很奇特的构造webshell的方法。

    信安之路
  • ssh的时候我最常用的6个快捷键

    ctrl+U:删除行首至光标所在处的所有内容 ctrl+K:删除光标所在处至行尾的所有内容

    我爱你的一诺
  • 使用jsTree树形控件【1】入门

    部署环境使用压缩版的jsTree.min.js,如果是开发环境可以使用jsTree.js

    用户2936342
  • 一个根据ICHD-3国际分类的头痛疾病诊断逻辑决策支持系统(CS AI)

    决策支持系统在医学领域扮演着重要的角色,因为它们可以增强临床医生处理复杂决策过程的效率和有效性。然而,在头痛疾病的诊断中,现有的方法和工具仍然不是最佳的。一方面...

    太子钟
  • python中property装饰器,迭代器,生成器,http请求中的post和put的区别,URL和URI, RESTfulAPI

    python property() 函数: @property装饰器就是负责把一个方法变成属性来进行调用的结构,实现既可以检查参数,又可以以点的形式进行调用类...

    武军超
  • 前端经常用网站 原

    https://loading.io/      很多的loading样式,可以导出gif,svg,css格式。

    tianyawhl
  • 六、面向对象进阶

    生成器 1、什么是生成器 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局...

    酱紫安

扫码关注云+社区

领取腾讯云代金券