js函数参数设置默认值

php有个很方便的用法是在定义函数时可以直接给参数设默认值,如:

function simue ($a=1,$b=2){
  return 
$a+$b;
}
echo simue(); //输出3
echo simue(10); //输出12
echo simue(10,20); //输出30

但js却不能这么定义,如果写function simue(a=1,b=2){}会提示缺少对象。

js函数中有个储存参数的数组arguments ,所有函数获得的参数会被编译器挨个保存到这个数组中。于是我们的js版支持参数默认值的函数可以通过另外一种变通的方法实现,修改上例:

function simue (){
  var a = arguments[0] ? arguments[0] : 1;
  var b = arguments[1] ? arguments[1] : 2;
  return 
a+b;
}
alert( simue() ); //输出3
alert( simue(10) ); //输出12
alert( simue(10,20) ); //输出30
### Golang 中为函数参数设置默认值的方法 Go 语言本身并不支持像 Python 或 JavaScript 那样的直接为函数参数指定默认值的功能。然而,通过一些设计模式和技巧,可以实现类似的默认参数功能。 #### 使用结构体作为参数并设定默认值 一种常见的方法是将所有可能的参数封装在一个结构体内,并在初始化时为其字段赋予默认值。随后,在函数调用时可以通过可变参数传递这些配置项[^1]: ```go type MyStruct struct { Param1 string Param2 int } func NewMyStruct() *MyStruct { return &MyStruct{ Param1: "default-value", Param2: 42, } } func MyFunction(config ...*MyStruct) { cfg := NewMyStruct() if len(config) > 0 && config[0] != nil { if config[0].Param1 != "" { cfg.Param1 = config[0].Param1 } if config[0].Param2 != 0 { cfg.Param2 = config[0].Param2 } } fmt.Printf("Param1=%s, Param2=%d\n", cfg.Param1, cfg.Param2) } ``` 上述代码展示了如何利用结构体来模拟默认参数的行为。 #### 利用 Functional Options 设计模式 另一种更灵活的方式是采用 Functional Options 模式。此模式的核心思想是创建一系列选项函数,用于修改目标对象的状态。这种方法不仅能够很好地处理默认值问题,还能保持接口简洁清晰[^5]: ```go type Dialer struct { Timeout time.Duration Network string } // Option 定义了一个函数类型,接受 *Dialer 并对其进行修改。 type Option func(*Dialer) // WithTimeout 是一个具体的 Option 实现,用来设置超时时间。 func WithTimeout(d time.Duration) Option { return func(dialer *Dialer) { dialer.Timeout = d } } // WithNetwork 是另一个 Option 实现,用来设置网络协议。 func WithNetwork(n string) Option { return func(dialer *Dialer) { dialer.Network = n } } // NewDialer 创建一个新的 Dialer 对象,默认值会被预先填充, // 同时允许通过 options 参数覆盖某些字段。 func NewDialer(options ...Option) *Dialer { d := &Dialer{ // 默认值 Timeout: 30 * time.Second, Network: "tcp", } for _, option := range options { option(d) } return d } ``` 这种技术使得我们可以轻松地向 `NewDialer` 添加新的行为而无需更改其签名。 #### 结合可变参数与类型断言 还可以借助可变参数列表配合类型断言机制达到类似效果。例如下面的例子演示了当未显式提供某个特定类型的参数时会应用预设值的情况[^3]: ```go import ( "fmt" ) func Concat(a interface{}, b ...interface{}) (result string) { switch v := a.(type) { case string: result += v default: panic(fmt.Sprintf("Unsupported type %T", a)) } for _, param := range b { if strVal, ok := param.(string); ok { result += strVal } else if numVal, ok := param.(int); ok { result += strconv.Itoa(numVal) } else { panic(fmt.Sprintf("Unsupported parameter type %T", param)) } } return result } ``` 在这个例子中,如果没有给出第二个整数型参数,则不会影响最终的结果计算过程。 综上所述,尽管 Go 不具备内置的支持函数参数默认值的能力,但开发者仍然有许多途径去构建具有相似特性的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值