在golang中对常量进行无类型操作意味着什么?

can*_*dry 16 go

规范说:

常量可以是打字的或无类型的

我对我的理解有点怀疑.在规范中考虑这个例子:

const l = "hi"             // l == "hi"  (untyped string constant)
const m = string(k)        // m == "x"   (type string)
Run Code Online (Sandbox Code Playgroud)

规范说:

常量可以通过常量声明或转换显式赋予类型,或者在变量声明或赋值中使用时隐式赋值,或者作为表达式中的操作数使用

通过这个陈述,为什么不l打字,因为它显然是一个不变的声明?

另一个例子更清楚这种行为

type Foo string
func f(a Foo) {}

func main() {
  f("sarkozy")

  const t = "julie gayet"
  f(t)

  s := "hollande"

  //compile error
  // f(s)

  f(Foo(s)) // ok
}
Run Code Online (Sandbox Code Playgroud)

f("sarkozy")编译的原因是由于规范中的可分配性的这一陈述?

x是一个无类型常量,可由类型T的值表示.

我的论点如下:

  • "萨科齐"是一个无用的文字.
  • 因此,"sarkozy"可以表示Foo我可以像这样强制类型 Foo("sarkozy")
  • f(s)失败,因为s不是无类型的.

ANi*_*sus 18

为什么不打字,因为它显然是一个不变的声明?

是的,这显然是一个不变的声明,正如你的引述所说:

常量可以通过常量声明显式给出

但是,在您的情况下,没有明确给定的类型.当"在变量声明或赋值中使用或作为表达式中的操作数"时,您只能具有隐式给定的类型.

f("sarkozy")编译的原因是由于这个关于规范中可转让性的陈述吗?

是的,f("sarkozy")编译的原因是因为"sarkozy"的无类型常量在用作表达式中的操作数时隐式给出了类型,例如在您的情况下.

"sarkozy"隐含地给出了类型 Foo

那为什么不f(s)编译?(好吧,那不是问题,但问题仍然存在)

你的论点指出:"f(s)失败,因为s不是无类型的."

是真的,s不是无类型的.s是变量而不是常量,变量不能是无类型的.

Go规范声明变量声明:

如果类型不存在且相应的表达式求值为无类型常量,则声明的变量的类型如§Assignments中所述.

这指的是从我的理解到以下内容:

常量首先分别转换为bool,rune,int,float64,complex128或string类型,具体取决于值是布尔值,符文,整数,浮点数,复数还是字符串常量.

那么,以下行:

s := "hollande"
Run Code Online (Sandbox Code Playgroud)

将声明类型的变量(非常)s,string因为右手表达式是无类型的字符串常量.在变量声明期间隐式给出了类型,而不是通过分析它将在后面使用的上下文.

然后,f(s)将导致编译错误,因为您尝试使用类型string的值,其中type 的值Foo是预期的.

  • 谢谢。这个“变量不能是非类型化的”是我理解的关键。 (3认同)