点击上方蓝色“ Go语言中文网 ”关注, 每天一起学 Go

这是我们 Golang 系列教程的第五篇。

定义

5-89I love Go67.89

看看下面的代码:

var a int = 50
var b string = "I love Go"
ab50I love GOconst50I love Goconst
cannot assign to a.
package main

func main() {
    const a = 55 // 允许
    a = 89       // 不允许重新赋值
}

在线运行程序[1]

常量的值会在编译的时候确定。因为函数调用发生在运行时,所以不能将函数的返回值赋值给常量。

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("Hello, playground")
    var a = math.Sqrt(4)   // 允许
    const b = math.Sqrt(4) // 不允许
}

在线运行程序[2]

amath.Sqrt(4)
bmath.Sqrt(4)const b = math.Sqrt(4)error main.go:11: const initializer math.Sqrt(4) is not a constant)

字符串常量

Hello WorldSam

什么类型的字符串属于常量?答案是他们是无类型的。

Hello World
const hello = "Hello World"
Hello Worldhellohello
Samname
package main

import (
    "fmt"
)

func main() {
    var name = "Sam"
    fmt.Printf("type %T value %v", name, name)

}

在线运行程序[3]

var name = "Sam"nameSam

有没有办法创建一个带类型的常量?答案是可以的。以下代码创建一个有类型常量。

const typedhello string = "Hello World"
typedhellostring

Go 是一个强类型的语言,在分配过程中混合类型是不允许的。让我们通过以下程序看看这句话是什么意思。

package main

func main() {
        var defaultName = "Sam" // 允许
        type myString string
        var customName myString = "Sam" // 允许
        customName = defaultName // 不允许

}

在线运行程序[4]

defaultNameSamSamstringdefaultNamestring
myStringstring
myStringcustomNameSamSamcustomNamemyString
stringdefaultNamemyStringcustomNamemyStringstringdefaultNamecustomNamemain.go:7:20: cannot use defaultName (type string) as type myString in assignmen

布尔常量

truefalse
package main

func main() {
    const trueConst = true
    type myBool bool
    var defaultBool = trueConst // 允许
    var customBool myBool = trueConst // 允许
    defaultBool = customBool // 不允许
}

在线运行程序[5]

上面的程序是自我解释的。

数字常量

数字常量包含整数、浮点数和复数的常量。数字常量中有一些微妙之处。

让我们看一些例子来说清楚。

package main

import (
    "fmt"
)

func main() {
    const a = 5
    var intVar int = a
    var int32Var int32 = a
    var float64Var float64 = a
    var complex64Var complex64 = a
    fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}

在线运行程序[6]

a5aa
package main

import (
    "fmt"
)

func main() {
    var i = 5
    var f = 5.6
    var c = 5 + 6i
    fmt.Printf("i's type %T, f's type %T, c's type %T", i, f, c)

}

在线运行程序[7]

55.65+6ii's type int, f's type float64, c's type complex128

现在我希望下面的程序能够正确的工作。

package main

import (
    "fmt"
)

func main() {
    const a = 5
    var intVar int = a
    var int32Var int32 = a
    var float64Var float64 = a
    var complex64Var complex64 = a
    fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}

在线运行程序[8]

a5avar intVar int = aaintintvar complex64Var complex64 = aacomplex64

数字表达式

数字常量可以在表达式中自由混合和匹配,只有当它们被分配给变量或者在需要类型的代码中的任何地方使用时,才需要类型。

package main

import (
    "fmt"
)

func main() {
    var a = 5.9/8
    fmt.Printf("a's type %T value %v",a, a)
}

在线运行程序[9]

5.985.9/80.7375aa's type float64 value 0.7375

上一教程 - 类型

下一教程 - 函数[10]

推荐阅读

  • Go 经典入门系列 4:类型

福利 我为大家整理了一份 从入门到进阶的Go学习资料礼包 ,包含学习建议:入门看什么,进阶看什么。 关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

08d1d1edf727e843519ba6c523940654.png