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

栏目: Go · 发布时间: 7年前

内容简介:[TOC]201808构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。

[TOC]

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)

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Web Reputation Systems

Building Web Reputation Systems

Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99

What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具