golang 服务或结构体可选参数的赋值

// 服务结构体
type Server struct {
    opts options //可选参数变量
    addr string
}

//可选参数列表
type options struct {
    A int
    B string
    C bool
    D int
}

// 为可选参数赋值的函数
type ServerOption func(*options)

func Afunc(a int) ServerOption {
    return func(o *options) {
        o.A = a
    }
}
func Bfunc(b string) ServerOption {
    return func(o *options) {
        o.B = b
    }
}
func Cfunc(c bool) ServerOption {
    return func(o *options) {
        o.C = c
    }
}

//新建服务
func NewServer(addr string, opt ....ServerOption) *Server {
    var opts options
    for _, o := opt {
        o(&options)
    }

    return &Server{
        opts: opts,
        addr: addr,
    }
}
// 实例说明
server := NewServer("aaaa", Afunc(1), Cfunc(true))

原文地址:https://www.cnblogs.com/share-ideas/p/11564310.html

时间: 2024-11-08 17:08:05

golang 服务或结构体可选参数的赋值的相关文章

C语言 结构体作为参数和返回值使用

方案一:结构体变量作为参数,进行传值. 编译器需要拷贝,不影响origin value,使用成员操作符(.)直接访问 /********************************************************************** * 版权所有 (C)2017, Wang maochun. * * 文件名称:travel.cpp * 文件标识:无 * 内容摘要:主要演示结构体作为参数以及返回值 * 其它说明:"传值” * 当前版本:V1.0 * 作 者:Wang m

结构体2之变量赋值于字符串

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct dangdang 5 { 6 char email[30]; 7 char name[30]; 8 char addr[100]; 9 int num; 10 int bugnum; 11 char tel[20]; 12 char phone[20]; 13 double RMB; 14 int dangdang;//成员名可以和类名同名 15 }dx,dy= { 16 &

结构体作为参数的反汇编

1:函数传参数的方式是将数据进行拷贝传递的. 2:基本数据类型编译器一般是通过PUSH指令来将参数入栈的,但是当传入的参数是结构体时,会采取,函数堆栈初始化的方式进行参数的拷贝 PUST EBP MOVE EBP,ESP SUP ESP,40H MOV ESI,[EBP-40] MOV EAX,0CCCCCCCH MOV ECX,16H;          需要初始化的堆栈的长度是40H也就是56个字节的长度,在32位的系统中,ESP的移动单位长度是4字节,所以需要16次初始化操作 REP ST

C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】

[1]结构体作为输入输出参数 C++代码: typedef struct _testStru1 { int iVal; char cVal; __int64 llVal; }testStru1; EXPORTDLL_API void Struct_Change( testStru1 *pStru ) { if (NULL == pStru) { return; } pStru->iVal = 1; pStru->cVal = 'a'; pStru->llVal = 2; wprintf(

golang 使用匿名结构体的问题

golang允许使用匿名结构体,形如 type Test struct { param1 struct { param2 string } } 一般在使用的时候可以直接这样初始化 a := Test{ param1: struct{ param2 string }{param2: "test"}, } 或者 b := new(Test) b.param1.param2 = "test" 但今天遇到一种情况 匿名结构体的成员上有tag声明,形如 type Test s

Golang中函数结构体,将函数转换为接口

函数结构体,将函数转换为接口 定义一个函数类型 F,并且实现接口 A 的方法,然后在这个方法中调用自己.这是 Go 语言中将其他函数转换为接口 A 的常用技巧(参数返回值定义与 F 一致) 实现一个动态生成的"回调函数",比如缓存中,当key不存在,则需要从数据库或文件等远程数据源中取数据.所以回调函数不能写死. 采用用户自定义回调函数的方法,因此,在缓存的数据结构中,有一个成员方法变量为回调函数. 下面这段代码就是一个示例. type Getter interface { Get(k

Golang基础之结构体

Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: // 将MyInt定义为int类型 type MyInt i

Golang项目之结构体版学生管理系统

前言 学习第4天,基于结构体的方式对函数版本重构编写小项目:学生管理系统 代码 package main import ( "fmt" "os" ) // 菜单系统(将菜单系统封装到函数中) func showMenu(){ fmt.Println("欢迎光临学生管理系统") fmt.Println(` 1.查看所有学生 2.新增学生 3.删除学生 4.退出 `) } // 造一个存储学生数据的类型 type student struct{ id

C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warning(disable:4996) typedef struct _Student { char name[64]; int age; }Student; typedef struct _Teacher { char name[64]; int age; char *p1; char **p2; Student