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的值表示。
我的论点如下:
Foo
可以表示“sarkozy”意味着我可以像 Foo("sarkozy")
f(s)
失败,因为s不是无类型。答案 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
。