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

时间:2014-03-25 02:01:10

标签: go

spec说:

  

常量可以是键入的或无类型的

我对我的理解有点怀疑。 请在规范中考虑此示例:

const l = "hi"             // l == "hi"  (untyped string constant)
const m = string(k)        // m == "x"   (type string)

规范说:

  

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

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

使用另一个example

,此行为更加清晰
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
}

f("sarkozy")编译的原因是由于此规范中关于可转让性的声明吗?

  

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

我的论点如下:

  • “sarkozy”一个无用的文字。
  • 因此,Foo可以表示“sarkozy”意味着我可以像 Foo("sarkozy")
  • 那样输入强制
  • f(s)失败,因为s不是无类型

1 个答案:

答案 0 :(得分:16)

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

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

  

常量可以通过常量声明

明确地给出类型

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

f(“sarkozy”)编译的原因是由于此规范中的可转让性声明吗?

是的,f("sarkozy")编译的原因是因为“sarkozy”的无类型常量在用作表达式中的操作数时隐式给出了类型。

“sarkozy”隐含地给出了Foo

的类型

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

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

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

Go规范指出Variable Declarations

  

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

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

  

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

所以,以下一行:

s := "hollande"

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

f(s)将导致编译错误,因为您尝试使用类型为string的值,其值为Foo