声明
在 Go 语言中,声明(declaration)是定义变量、常量、类型和函数等元素的过程。声明是程序的基本组成部分,正确理解和使用声明是编写 Go 程序的基础。本节将详细介绍 Go 语言中的各种声明,并提供相关示例。
变量声明
变量声明用于定义程序中的变量。Go 语言提供了多种声明变量的方式。
1. 使用 var 关键字声明变量
使用 var 关键字可以显式声明变量,并为其指定类型和初始值。
go
package main
import "fmt"
func main() {
// 声明一个整型变量并赋初始值
var i int = 10
fmt.Println(i)
// 声明一个字符串变量,使用默认初始值(空字符串)
var s string
fmt.Println(s)
// 声明一个布尔变量并赋初始值
var b bool = true
fmt.Println(b)
}2. 简短变量声明
简短变量声明使用 := 语法,可以在函数内部声明变量,并根据初始值自动推断类型。
go
package main
import "fmt"
func main() {
// 声明并初始化整型变量
i := 10
fmt.Println(i)
// 声明并初始化字符串变量
s := "Hello, Go"
fmt.Println(s)
// 声明并初始化布尔变量
b := true
fmt.Println(b)
}3. 多变量声明
可以同时声明多个变量,使用 var 关键字或简短声明语法。
go
package main
import "fmt"
func main() {
// 使用 var 关键字声明多个变量
var x, y, z int = 1, 2, 3
fmt.Println(x, y, z)
// 使用简短声明语法声明多个变量
a, b, c := 4, "Go", false
fmt.Println(a, b, c)
}常量声明
常量声明使用 const 关键字,定义在程序执行期间其值不会改变的变量。常量可以是数字、字符串或布尔类型。
go
package main
import "fmt"
func main() {
// 声明整数常量
const Pi = 3.14
fmt.Println(Pi)
// 声明字符串常量
const Greeting = "Hello, Go"
fmt.Println(Greeting)
// 声明布尔常量
const IsGoAwesome = true
fmt.Println(IsGoAwesome)
}使用 iota 枚举常量
iota 是一个特殊的常量生成器,可以用来简化一系列相关常量的定义。每遇到一个 const 关键字,iota 的值就会从 0 开始,每定义一个常量 iota 的值就会自动递增。
go
package main
import "fmt"
// 使用 iota 定义枚举常量
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
func main() {
fmt.Println(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) // 输出 0 1 2 3 4 5 6
}类型声明
类型声明使用 type 关键字,定义新的类型名称(类型别名)或自定义类型。类型声明可以使代码更具可读性和可维护性。
1. 类型别名
类型别名为已有类型定义新的名称。
go
package main
import "fmt"
// 定义类型别名
type MyString string
func main() {
var s MyString = "Hello, Go"
fmt.Println(s)
}2. 自定义类型
自定义类型用于定义结构体、接口等复杂类型。
go
package main
import "fmt"
// 定义结构体类型
type Person struct {
Name string
Age int
}
// 定义接口类型
type Describer interface {
Describe() string
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p)
}3. 函数类型
函数类型用于定义具有相同签名的函数集合。
go
package main
import "fmt"
// 定义函数类型
type MathOperation func(int, int) int
// 定义加法操作
func add(a, b int) int {
return a + b
}
// 定义减法操作
func subtract(a, b int) int {
return a - b
}
func main() {
// 声明一个函数类型变量并赋值
var op MathOperation
// 使用加法操作
op = add
fmt.Println("Addition:", op(3, 4)) // 输出 7
// 使用减法操作
op = subtract
fmt.Println("Subtraction:", op(3, 4)) // 输出 -1
}函数声明
函数声明使用 func 关键字,定义具有特定功能的代码块。函数可以有参数和返回值。
go
package main
import "fmt"
// 定义无参无返回值函数
func sayHello() {
fmt.Println("Hello, Go")
}
// 定义有参数的函数
func add(a int, b int) int {
return a + b
}
// 定义多返回值的函数
func swap(x, y string) (string, string) {
return y, x
}
func main() {
sayHello()
sum := add(3, 4)
fmt.Println("Sum:", sum)
a, b := swap("first", "second")
fmt.Println("Swapped:", a, b)
}全局声明
全局声明的变量、常量或类型在整个包中都可以访问和使用。这些声明通常位于包级别(函数体外),在包的任意位置都可以使用。
go
package main
import "fmt"
// 全局变量声明
var GlobalVar = "I am a global variable"
// 全局常量声明
const GlobalConst = "I am a global constant"
// 全局类型声明
type GlobalType struct {
name string
age int
}
func main() {
// 使用全局变量
fmt.Println(GlobalVar)
// 使用全局常量
fmt.Println(GlobalConst)
// 使用全局类型
g := GlobalType{name: "Alice", age: 30}
fmt.Println(g)
}变量作用域
变量的作用域(scope)决定了它可以被访问的范围。变量作用域包括包作用域、函数作用域和块作用域。
1. 包作用域
包作用域的变量在整个包中都可访问。
go
package main
import "fmt"
// 包作用域变量
var packageVar = "I am at package level"
func main() {
fmt.Println(packageVar)
}2. 函数作用域
函数作用域的变量仅在函数内可访问。
go
package main
import "fmt"
func main() {
// 函数作用域变量
var funcVar = "I am at function level"
fmt.Println(funcVar)
}3. 块作用域
块作用域的变量仅在块内可访问,块由 {} 定义。
go
package main
import "fmt"
func main() {
if true {
// 块作用域变量
var blockVar = "I am at block level"
fmt.Println(blockVar)
}
// fmt.Println(blockVar) // 错误:块作用域外无法访问 blockVar
}