Parameters golang函数中的常数参数

Parameters golang函数中的常数参数,parameters,go,constants,Parameters,Go,Constants,我是刚来戈朗的。是否可以在函数中将参数标记为常量? 这样就不会意外修改参数。否 可以在函数体中声明常量,但不能作为参数 在Go中,常量是在编译时创建的,永远不会更改,而函数参数必须在运行时随每次调用而更改。否,这目前是不可能的。有几种情况需要区分: 当“正常”传递参数时,即通过值传递参数时,您不必担心修改它,因为这些参数的行为类似于局部变量,因此您可以在函数内部修改它们,但在函数外部看不到您的更改。但是,这条规则有一个例外 …某些Go类型(例如指针、切片、通道、贴图)是引用类型,这意味着对它们

我是刚来戈朗的。是否可以在函数中将参数标记为常量? 这样就不会意外修改参数。

可以在函数体中声明常量,但不能作为参数


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

否,这目前是不可能的。有几种情况需要区分:

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

    • 对于通过值传递的常量参数,仍然有一个方便的应用程序:您不能无意中更改初始值

      考虑以下代码:

      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
      }
      
      func生成(count int)(值[]字节){
      值=生成([]字节,计数)
      
      对于i:=0;iYes,我担心参数更改会在函数外部传播。@KarthikGR您能简单地按值传递而不是传递指针吗?例如,
      func myFunc(arg int)
      而不是
      func myFunc(arg*int)
      @weberc2对于结构类型,我们通常通过引用来传递它,这样函数堆栈就不会太大了。@KarthikGR通常我处理的结构都很小,所以我通常不太担心堆栈的大小。也许这对我来说是个坏习惯,但我从来没有经历过堆栈溢出(当然,我的经验不是确定的)。除了溢出堆栈之外,为什么还要担心堆栈大小?它是否比分配给堆更会降低性能?@KarthikGR-好的,那么您正在将指向结构的指针作为参数进行PASS?也许您应该在问题中提到:)我假设您是按值传递参数。缺少常量参数不会影响性能ot阻止了我们想要实现的功能,但我觉得它的存在提供了该功能的明确意图在C++中,它不修改输入字符串。奇斯诺尔在GO中总是推荐值的传递,除非明确需要修改参数:编译器足够聪明,知道该怎么做。GO的一个原因是程序员不必担心这些细节。d德尔福当我第一次开始玩围棋的时候-现在我不再这么做了(这里的“围棋”人在这方面很有帮助)go FAQ还建议使用引用来传递大结构,即使它们未被修改,也是出于内存优化的原因。实际上,当常量参数派上用场时,这种情况就是如此。您现在可以将其作为注释。这不是常量参数的示例用例。值类型是不可变的,没有理由将值设为const。基本上,您无法通过使用奇特的语言构造来防止自己在下一行代码中出错。您可以删除
      counter
      variable increment语句,但仍然有一个错误:
      for i:=0;i