在Go中,双引号包括的值是字符串常量,例如,"Hello World"
。
字符串常量属于什么类型?答案是没有类型(untyped)。
像"Hello World"
这样的字符串常量没有任何类型。
const hello = "Hello World"
在上面的例子中,我们将"Hello World"
赋值给常量Hello
,常量hello
仍然没有类型。
go是一种强类型语言。所有变量都需要有显式类型。那么,下面的代码中,变量name
被赋值无类型常量Sam
,会发生什么情况?
package main
import (
"fmt"
)
func main() {
var name = "Sam"
fmt.Printf("type %T value %v", name, name)
}
答案是无类型常量有一个与之关联的默认类型,当且仅当代码需要它时,才起作用。
在var name = "Sam"
语句中,name
需要一个类型,它从字符串常量"Sam"
的默认类型中获得该类型:字符串。
但是也可以创建类型化常量。下面的代码创建一个类型化常量。
const typedhello string = "Hello World"
上面代码中的typedhello
是string
类型的常量。
go是一种强类型语言。不允许在赋值期间混合类型。让我们通过一个程序来看看这意味着什么。
package main
func main() {
var defaultName = "Sam" //允许
type myString string
var customName myString = "Sam" //允许
customName = defaultName //不允许
}
在上面的代码中,我们首先创建一个变量defaultName
,并给其赋值常量Sam
。
常量Sam
的默认类型是string
,所以在赋值之后,defaultName的类型是string。
在下一行中,我们创建一个新的类型myString
,它是string
的别名。
然后我们创建一个myString
类型的变量customName
,并给其赋值常量Sam
。由于常量Sam
是无类型的,所以可以将它分配给任何字符串变量。因此这个赋值是允许的,customName
获取类型myString
。
现在我们有一个类型为string
的变量defaultName
和另一个类型为myString
的变量customName
。尽管我们知道myString
是string
的别名,但Go的强类型策略不允许将一种类型的变量分配给另一种类型。因此,不允许赋值customName = defaultName
,否则编译器将报错。