我是刚接触golang的人。 是否可以在功能中将参数标记为常量?
这样就不会意外修改参数。

  • 缺少常量参数不会阻止我们想要实现的目标,但是我觉得它的存在提供了该功能的明确意图。 例如,c中的strlen(const char * str)表示它不会修改输入字符串。
  • Go编程语言短语手册中的Chisnall建议始终在Go中按值传递,除非您明确需要修改参数:编译器足够聪明,知道该怎么做。 发明Go的原因之一是让程序员不必担心这些细节。 刚开始使用Go时,我也尝试与C ++和Delphi进行类比-现在我不再这样做了(此处的" GoTo"家伙对此非常有帮助)
  • go FAQ还建议出于内存优化的原因,即使未修改大型结构,也要使用引用来传递大型结构。 当const参数派上用场时,实际上就是这种情况。

否,目前无法执行此操作。有几种情况可以区分:

  • 当"正常"传递参数(即按值)时,您不必担心对其进行修改,因为这些参数的行为类似于局部变量,因此您可以在函数内部对其进行修改,但是更改不会在函数外部可见。功能。但是,此规则有一个例外...
  • ...某些Go类型(例如,指针,切片,通道,地图)是引用类型,这意味着对它们的更改将在函数外部可见。一些细节在这里给出。
  • 您可以将指针(例如,指向结构)作为参数传递,在这种情况下,更改将在函数外部可见。如果这不是故意的,那么目前您无能为力。因此,如果要传递指针以避免复制大型结构,则最好谨慎使用-请记住,"过早的优化是万恶之源"。此处的转到常见问题解答中给出了一些提示(它涉及方法接收者,但也适用于参数)。
  • 是的,我担心在函数外传播的参数更改。
  • @KarthikGR您可以简单地按值传递而不传递指针吗?例如,用func myFunc(arg int)代替func myFunc(arg *int)
  • @ weberc2对于结构类型,我们通常通过引用将其传递,以便函数堆栈不会很大。
  • @KarthikGR通常,我处理的结构很小,因此我通常不必过多担心堆栈大小。也许这对我来说是不好的做法,但是我从未经历过堆栈溢出(当然,这并不是说我的经验是确定的)。除了使堆栈溢出之外,为什么还要担心堆栈大小?它是否比分配到堆更降低性能?
  • @KarthikGR-好的,因此您正在将指向结构的指针作为参数?也许您应该在您的问题中提到:)我假设您是按值传递参数。
  • @KarthikGR在您澄清之后,我现在已经修改了答案

值传递的const参数仍然有一个方便的应用程序:您不能无意间更改初始值。

考虑以下代码:

1
2
3
4
5
6
7
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代码,在编译过程中无警告或错误。这种错别字可能很难追踪。

  • 您可以立即发表评论
  • 这不是const参数的示例用例。值类型是不可变的,没有理由将值设为const。
  • 基本上,您无法使用奇特的语言构造来保护自己免受下一行代码中的错误的影响。您可以删除counter变量增量语句,但仍然出现错误:for i:=0; i

没有。

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

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