1. 基本语法
Go的Hello World程序:
go
复制代码
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
代码分析:
package main:Go程序以包为组织单位,其中main包表示程序的入口。import:用于导入标准库或第三方库,例如fmt库用于格式化输出。func main():每个Go程序必须包含一个main函数,这是程序的执行起点。
Go语言通过强约束的编译规则(如不允许定义未使用的变量或包)提高了代码的规范性,同时减少了隐式错误。
2. 变量与类型
Go语言是静态强类型语言,支持显式声明和隐式类型推断。
go
复制代码
var a int = 42 // 显式声明
b := "hello" // 隐式推断
var声明变量:需指定类型,可选初始值。:=短变量声明:常用于函数内部,Go会根据初值推断变量类型。
此外,Go支持多个变量同时声明:
go
复制代码
var x, y, z = 1, 2, 3
3. 控制结构
Go的控制结构与C语言类似,支持条件语句、循环和选择结构,但省略了括号。
go
复制代码
if x > 10 {
fmt.Println("x is greater than 10")
}
for i := 0; i < 5; i++ {
fmt.Println(i)
}
特点:
if语句支持在条件前定义变量,例如if n := 10; n > 5。- Go仅提供
for作为循环结构,代替了C语言的while。
4. 函数
Go语言的函数支持多种灵活的定义方式,包括返回多个值。
go
复制代码
func add(x int, y int) int {
return x + y
}
func swap(a, b string) (string, string) {
return b, a
}
特点:
- 参数类型可以简写:当多个参数类型相同时,只需在最后声明类型。
- 多返回值函数:通过元组形式返回多个值。
函数还支持匿名函数和闭包:
go
复制代码
add := func(x, y int) int {
return x + y
}
fmt.Println(add(3, 4))
5. 指针与内存管理
Go支持指针,但不允许直接操作指针(如C语言中的*p = value),以此提升安全性。
go
复制代码
var a = 10
var p = &a // 取地址
fmt.Println(*p) // 解引用
Go语言内置了垃圾回收(GC),程序员无需手动释放内存。
二、Go语言独特特性
1. 并发
Go语言以其强大的并发支持著称,主要依赖于goroutine和channel。
goroutine:
轻量级线程,用go关键字启动。例如:
go
复制代码
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go printNumbers() // 启动新的goroutine
fmt.Println("Main function")
time.Sleep(1 * time.Second) // 等待goroutine执行完毕
}
channel:
用于goroutine之间的数据通信,保证并发的安全性。
go
复制代码
package main
import "fmt"
func sum(a []int, c chan int) {
total := 0
for _, v := range a {
total += v
}
c <- total // 将结果发送到通道
}
func main() {
c := make(chan int)
go sum([]int{1, 2, 3}, c)
fmt.Println(<-c) // 从通道接收数据
}
特性分析:
- 轻量级:一个
goroutine仅占用数KB内存。 - 安全性:通过
channel传递数据避免共享内存问题。
2. 接口与多态
Go没有类的概念,取而代之的是接口(interface),通过接口实现多态。
go
复制代码
package main
import "fmt"
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func main() {
var s Shape
s = Circle{Radius: 5}
fmt.Println("Circle Area:", s.Area())
s = Rectangle{Width: 4, Height: 6}
fmt.Println("Rectangle Area:", s.Area())
}
特点:
- 接口只定义行为,不关心实现。
- 类型实现接口的方式是隐式的,无需显式声明“实现了某接口”。