golang函数中的常量参数

时间:2014-02-28 09:40:03

标签: parameters go constants

我是golang的新手。是否可以将参数标记为函数常量? 这样就不会意外修改参数。

3 个答案:

答案 0 :(得分:18)

不,这是目前无法实现的。有几种情况需要区分:

  • 当传递参数“正常”时,即按值传递时,您不必担心修改它,因为这些参数的行为类似于局部变量,因此您可以在函数内修改它们,但您的更改不会是在功能外可见。但是,这条规则有一个例外......
  • ...一些Go类型(例如指针,切片,通道,地图)是引用类型,这意味着对它们的更改在函数外部可见。一些细节是here
  • 您可以将指针(例如,结构)作为参数传递,在这种情况下,更改将在函数外部可见。如果不是这样的话,目前你无能为力。因此,如果你传递指针以避免复制大型结构,最好谨慎使用它 - 记住,“过早优化是所有邪恶的根源”。 Go FAQ here中给出了一些提示(它指的是方法接收器,但它也适用于参数)。

答案 1 :(得分:2)

对值传递的const参数仍然有一个方便的应用:你不能无意中改变初始值。

请考虑以下代码:

func Generate(count int) (value []byte) {
   value = make([]byte, count)
   for i:=0; i<count; count++ {
       value[i] = byte(i) // just for an example
   }
   return
}

这是一个有效的Go代码,在编译期间没有警告或错误。这种拼写错误可能会让人痛苦。

答案 2 :(得分:1)

没有

您可以在函数体内声明一个常量,但不能作为参数声明。

在Go中,常量是在编译时创建的,永远不会改变,而函数参数必须在运行时随每次调用而改变。