首页 > 其他分享 >Golang技巧:如何为函数参数添加默认值?

Golang技巧:如何为函数参数添加默认值?

时间:2023-06-24 15:31:57浏览次数:43  
标签:return name 函数 Golang 函数参数 func 默认值 string

你是否是那些在Go中缺少默认参数值而感到沮丧的众多程序员之一?如果是的话,你绝对不是一个人!

image.png

如何为函数参数添加默认值。

你是否曾因为Go语言没有默认参数值而感到沮丧?好消息是,你并不孤单!这个令人讨厌的限制会让你的代码更加繁琐,难以阅读。

每次都需要写额外的代码来检查参数是否提供,并在没有提供时使用默认值。

别担心!有办法绕过这个限制,在你的Go函数中添加默认值。当然,这可能没有内置的方式方便,但至少你不必一直携带那把象征性的雨伞。

简单的包装器

一种方法是定义一个包装函数,它使用参数的默认值来调用原始函数。

如果客户端没有指定名称,那么默认名称为"Jack"。下面是使用包装器的示例:

func greet(name string) string {
	return "Hello, " + name
}

func greetWithDefaultJack(name string) string {
	if name == "" {
		name = "Jack"
	}
	return greet(name)
}

// you can have more than 1 default set
func greetWithDefaultJohn(name string) string {
	if name == "" {
		name = "John"
	}
	return greet(name)
}

通过这种方式,你可以在不修改greet函数内部任何代码的情况下设置greet的默认值。

“但这对于一个简单的函数来说太麻烦了吧?”

这可能是一个缺点,因为它需要你编写额外的代码,可能会使你的代码更难阅读。

隐藏你的参数

我们可以将函数的参数放在一个非导出的结构体中,让客户端根据需要初始化参数:

type greetingArguments struct {
	Name string
	Age  int
}

func GreetingArguments() greetingArguments {
	return greetingArguments{
		Name: "Jack",
		Age:  30,
	}
}

现在让我们定义我们的Greet函数:

func Greet(options greetingArguments) string {
	return "Hello, my name is " + options.Name + " and I am " + strconv.Itoa(options.Age) + " years old."
}

每次客户端想要使用Greet函数时,他们必须使用GreetingArguments()函数创建一个greetingArguments结构体。

这种方法仅适用于从包外部调用函数,而不适用于从包内部调用。

另一种选择是使用函数选项模式,它允许您将可变数量的选项作为参数传递给函数。这样可以更灵活,也更易于阅读,但也可能使代码更复杂。

函数选项模式

这种流行的模式在许多库中使用。在本节中,我将逐步介绍如何使用它:

  1. 创建一个结构体来保存我们的参数,包括两个字段:Name和Age。
type GreetingOptions struct {
	Name string
	Age  int
}
  1. 现在让我们定义Greet函数,将我们的新结构体作为参数:
func Greet(options GreetingOptions) string {
	return "Hello, my name is " + options.Name + " and I am " + strconv.Itoa(options.Age) + " years old."
}
  1. 这是一个有趣的部分,我们在结构体的字段中定义函数选项:
type GreetingOption func(*GreetingOptions)

func WithName(name string) GreetingOption {
	return func(o *GreetingOptions) {
		o.Name = name
	}
}

func WithAge(age int) GreetingOption {
	return func(o *GreetingOptions) {
		o.Age = age
	}
}
  1. 使用我们的新类型 GreetingOption 创建一个包装器:
func GreetWithDefaultOptions(options ...GreetingOption) string {
	opts := GreetingOptions{
		Name: "Jack",
		Age:  30,
	}
	for _, o := range options {
		o(&opts)
	}
	return Greet(opts)
}

GreetWithDefaultOptions 函数为 GreetingOptions 结构体的 Name(默认为“Jack”)和 Age(默认为30)字段设置默认值,然后将传递的选项作为参数应用于该结构体。

最后,它使用修改后的结构体作为参数调用 Greet 函数。

要使用此代码,您可以使用要自定义的选项调用 GreetWithDefaultOptions 函数:

greeting := GreetWithDefaultOptions(WithName("Alice"), WithAge(20))

// "Hello, my name is Alice and I am 20 years old."

许多库都使用了函数选项模式,包括mongodb、aws-sdk-go、gorm、cli等等。

总结

总结一下,在函数参数中添加默认值是一种在代码中提供灵活性和便利性的有用方法。将默认值纳入到函数中可以成为您工具包中有价值的技巧。

请记住,始终保持学习的态度,并享受编码的乐趣!祝您编码愉快!

如果你喜欢我的文章,点赞,关注,转发!

标签:return,name,函数,Golang,函数参数,func,默认值,string
From: https://blog.51cto.com/slagga/6541211

相关文章

  • golang 常用控制协程的三种方式
    waitGroupwaitGroup这种方式适用于一个任务可以被拆分成几个子任务,并且子任务之间的关联程度不高,全部的子任务都完成,才会进行下一阶段的任务。packagemainimport( "fmt" "sync" "time")funcmain(){ varwgsync.WaitGroup wg.Add(3) gofunc(){ deferwg.Do......
  • GoLang在不同系统打包
    配置Mac下编译Linux,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=linuxGOARCH=amd64goenv-wCGO_ENABLED=0GOOS=windowsGOARCH=amd64Linux下编译Mac,Windows平台的64位可执行程序:goenv-wCGO_ENABLED=0GOOS=darwinGOARCH=amd64goenv-wCGO_E......
  • GoLang图形用户界面编程实战(GUI编程)—fyne框架(一)
    一、前言GUI编程:图形用户界面编程。使用fyne框架实现。ps(目的)====>>ps,美图秀秀GUI=========>>fyne框架msys2模拟linux,在msys2中安装fyne框架二、安装msys2(win模拟linux)下载地址1(阿里镜像):https://mirrors.aliyun.com/msys2/distrib/x86_64/?spm=a2c6h.25603864.0.0.4e6c1484CbwZd......
  • golang 给对象的基础数据类型的指针类型的属性赋值
    概要有时我们可能碰到定义成下面这样的结构体,结构体里某些属性是基础数据类型,更确切的说,是基础数据类型的指针类型。typeStudentstruct{ namestring`json:"name"` age*int`json:"age"`//age是整型指针}不可行的写法此时该如何对这种成员属性进行赋值呢,下面......
  • golang 的 sync.WaitGroup
    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。官方对它的说明如下:AWaitGroupwaitsforacollectionofgoroutinestofinish.ThemaingoroutinecallsAddtosetthenumberofgoroutinestowaitfor.Thenea......
  • Golang 做的几个跟性能有关的工具
    1、Vegetahttps://github.com/tsenart/vegetaVegeta是一个万能的HTTP负载测试工具,提供命令行工具和一个开发包。使用方法:$vegetaattack-hUsageofattack:-duration=10s:Durationofthetest-header=:Targetsrequestheader-ordering="random":Attackorderi......
  • win下 golang 跨平台编译
    本篇文章是win下的跨平台编译。安装GCC编译器(MinGW)我们需要GCC编译环境,这里我选择的是:MinGW。mac下安装了Xcode自动就带了GCC,win下没有,所以我们用MinGW这个最小化安装的GCC。MinGW官网提供了一种自动在线下载安装的gui小程序,http://sourceforge.net/projects/mingw/files/Install......
  • Golang 中文转拼音
    翻遍整个GitHub,Golang中文转拼音类库,怎么就这么难找呢?于是我造了一个轮子:中文转拼音类库.目前来说应该是最好用的了.GitHub传送门:https://github.com/Lofanmi/pinyin-golang如果说基于汉字拼音字典,逐个汉字替换,也是可以转换的,但是碰到多音字就很麻烦了.而......
  • Golang如何优雅地关闭 channel
    Golang如何优雅地关闭channel萧瑟 golang面试经典讲解 2023-05-3121:00 发表于上海一、介绍想必听说过go的,应该都知道go的最大的特性goroutine并发编程,而说到并发编程,使用channel进行数据传输是go中的必修课。go的并发哲学:不要通过共享内存来通信,而要通过通......
  • golang的位运算
    二进制字节位的几个操作例子:0110&1011=0010//与AND都为10110|1011=1111//或OR至少一个为10110^1011=1101//异或XOR只能一个为10110&^1011=0100//位清除ANDNOT清除标志位,不都为1a&^b的意思就是清零a中,ab都为1......