t visible" // 不可导出的常量
常量溢出和默认类型
一个类型不确定常量所表示的值可能会溢出其默认类型。在这种情况下,只有当这个常量被用于一个可以容纳该值的上下文时,编译才会成功。
const big = 1 << 100 // 默认类型为 int,但值会溢出
var bigInt = big >> 99 // big 被用于一个 int64 上下文,没有溢出
字符串常量
字符串常量是包含在双引号中的一系列字符。
const hello = "Hello, world!"
布尔常量
布尔常量只有两个可能的值:true
和 false
。
const flagTrue = true
const flagFalse = false
枚举常量
通过使用 iota
,你可以创建一组递增的整数常量,通常用于枚举。
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
// ...
Saturday
)
复数常量
Go 支持复数类型,并且你可以创建复数常量。
const complexConst = 1 + 2i
强制类型转换
你可以通过强制类型转换将一个常量转换为另一种类型。
const integer = 42
const floatType = float32(integer)
计算表达式中的常量
常量也可以是计算表达式的结果,但表达式必须只包含常量值。
const calculated = 3 * 2 // 6
常量数组和切片
需要注意的是,在 Go 中,数组大小需要是常量。但切片和映射的大小可以动态改变,因此它们不能是常量。
const arraySize = 5
var arr [arraySize]int // 合法
五、变量
变量是存储数据值的存储单元,其值可以在运行时改变。在 Go 语言中,变量的使用非常灵活但又具有严格的类型安全性。
变量声明和赋值
基本声明
使用 var
关键字进行变量声明。
var x int
同时声明和赋值
var y int = 42
或者使用短变量声明形式:
z := 42
多变量声明
var a, b, c int
或者
var (
d int
e float64
)
类型描述
基本类型
包括 int
, float64
, bool
, string
等。
var integerVar int = 10
var floatVar float64 = 10.99
var boolVar bool = true
var stringVar string = "Hello, Go"
数值类型
Go 支持多种数值类型,包括 int8
, int16
, int32
, int64
, uint8
, uint16
, uint32
, uint64
, float32
, float64
等。
var smallInt int8 = 127
var largeInt int64 = 9223372036854775807
var unsignedInt uint16 = 65535
var floatNum float32 = 3.141592
字符和字符串
Go 有 rune
和 byte
类型来表示 Unicode 字符和 ASCII 字符。
var asciiChar byte = 'A'
var unicodeChar rune = '你'
var str string = "Hello, World!"
布尔类型
布尔类型只有两个值:true
和 false
。
var isActive bool = true
var isCompleted bool = false
指针
Go 支持指针类型,但不支持指针运算。
var pointer *int
x := 42
pointer = &x
数组和切片
var arrayExample [5]int = [5]int{1, 2, 3, 4, 5}
var sliceExample []int = arrayExample[1:4]
映射(Maps)
var countryCapitalMap map[string]string
countryCapitalMap = make(map[string]string)
countryCapitalMap["France"] = "Paris"
结构体(Structs)
type Employee struct {
ID int
Name string
Salary float64
}
var emp Employee
接口(Interfaces)
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
var s Shape = Circle{5.0}
函数类型
Go 中,函数也是一种类型,可以作为参数传递。
type AddFunc func(a int, b int) int
var add AddFunc = func(a int, b int) int {
return a + b
}
通道(Channels)
var messageChannel chan string = make(chan string)
复合类型
例如数组、切片、映射、通道、结构体和接口。
数组
var arr [5]int
切片
var slice []int
映射
var mapping map[string]int
通道
var ch chan int
结构体
type Person struct {
name string
age int
}
var p Person
接口
type Geometry interface {
Area() float64
}
var g Geometry
值的可寻址性
Go 语言中有些变量是可寻址的,意味着你可以获取这个变量的内存地址。
var myVar int = 42
var p *int = &myVar
变量作用域
在 Go 中,变量可以有不同的作用域:全局作用域、包内作用域、函数作用域、代码块作用域等。
var globalVar int // 全局作用域
func myFunction() {
var functionVar int // 函数作用域
{
var blockVar int // 代码块作用域
}
}
七、常量和变量的高级用法
在 Go 编程中,常量和变量不仅仅是数据存储的简单方式。它们有各种高级用法,可以用来优化代码、提高效率或实现复杂的编程模式。
常量的高级用法
枚举和 iota
Go 通过 iota
关键字支持枚举类型的实现。这在一组常量声明中是非常有用的。
const (
Monday = iota + 1 // Monday = 1
Tuesday // Tuesday = 2
Wednesday // Wednesday = 3
)
类型别名
使用类型别名,你可以将常量限制为自定义类型。
type Weekday int
const (
Sunday Weekday = iota
Monday
// ...
)
无类型和有类型常量
无类型的常量可以用在多种场合,它们会根据上下文进行类型推断。
const x = 42 // 无类型常量
var i int = x
var f float64 = x
变量的高级用法
变量的作用域
G