我正在学习Go语言,碰到看到这种类型的变量声明:

1
i:=1;

但是它说Go具有静态变量。 即变量应该以这种方式定义

1
var i int=1;

那么这两种方法有什么区别? 在第一个中,我们不需要指示数据类型。 为什么会这样呢?


第一个i := 1称为短变量声明。这是带有初始值设定项表达式但没有类型的常规变量声明的简写:

1
var IdentifierList = ExpressionList

您没有指定i的类型,但是i将具有基于某些规则的类型。它的类型将被自动推断。在这种情况下,它将是类型int,因为初始化器表达式1是无类型的整数常量,其默认类型为int,因此,当需要类型时(例如,在短变量声明中使用它),< x3>类型将被推导。

因此,Go是静态类型的。这意味着变量将具有静态类型,并且在运行时存储在变量中的值将始终为该类型。静态类型并不意味着您必须显式地指定静态类型,这仅意味着变量必须具有静态类型-在编译时决定-即使您使用短变量声明并且未指定它,也要满足哪种条件。

请注意,如果使用var关键字声明变量,也可以省略类型:

1
var i = 1

在这种情况下,类型也将从初始化程序表达式的类型中推导出。

规格:变量声明:

If a type is present, each variable is given that type. Otherwise, each variable is given the type of the corresponding initialization value in the assignment. If that value is an untyped constant, it is first converted to its default type; if it is an untyped boolean value, it is first converted to type bool. The predeclared value nil cannot be used to initialize a variable with no explicit type.

  • 好的,我现在知道了。 谢谢。 因此,由于i = 1并且1是整数,因此我将获得整数作为数据类型。 但是另一个疑问是整数本身是否具有子类型ryt的int8,int16,int 64? 那么我在这里将int8作为默认值吗?
  • @HariKrishnan此表达式:1是无类型的常量。 如果表达式是无类型的常量(而不是有类型的常量),则使用其默认类型,如规范所述,其默认类型为无类型整数常量的int。 如果使用类型常量,则显然使用了类型常量的类型。

Go的设计考虑了易用性。因此,新变量能够使用:=运算符获取右侧的隐式类型。同样,常量1例如在go中具有隐式类型。