该规范说:
常量可以是打字的或无类型的
我对我的理解有点怀疑.在规范中考虑这个例子:
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的值表示.
我的论点如下:
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
是预期的.