您好,登录后才能下订单哦!
# Go语言基本语法详解
## 一、Go语言概述
Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型编程语言。它于2009年正式发布,由Robert Griesemer、Rob Pike和Ken Thompson设计。Go语言以其简洁的语法、高效的并发模型和出色的性能而闻名,特别适合构建高并发、分布式系统。
### 1.1 Go语言特点
- **简洁高效**:语法简洁,学习曲线平缓
- **静态类型**:编译时检查类型安全
- **垃圾回收**:自动内存管理
- **原生并发**:goroutine和channel实现轻量级并发
- **跨平台**:支持多种操作系统和架构
- **工具链完善**:内置格式化、测试、文档工具
## 二、基础语法结构
### 2.1 Hello World程序
```go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
package main
:声明包名,可执行程序必须使用main包import "fmt"
:导入标准库的格式化I/O包func main()
:程序入口函数关键字:25个保留关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
标识符:区分大小写,以字母或下划线开头
字面量:数字、字符、字符串等
操作符:算术、比较、逻辑等运算符
分隔符:括号、分号等
Go是静态类型语言,变量必须先声明后使用。
// 标准声明格式
var name type = expression
// 示例
var age int = 30
var name string = "Alice"
var isActive bool = true
age := 30
name := "Alice"
isActive := true
var (
name string
age int
)
x, y := 1, 2
使用const
关键字声明,必须在编译时确定值。
const Pi = 3.14159
const (
StatusOK = 200
StatusNotFound = 404
)
// iota常量生成器
const (
Monday = iota + 1
Tuesday
Wednesday
)
类型 | 说明 | 范围 |
---|---|---|
int8 | 8位有符号整数 | -128到127 |
int16 | 16位有符号整数 | -32768到32767 |
int32 | 32位有符号整数 | -2^31到2^31-1 |
int64 | 64位有符号整数 | -2^63到2^63-1 |
uint8 | 8位无符号整数 | 0到255 |
uint16 | 16位无符号整数 | 0到65535 |
uint32 | 32位无符号整数 | 0到2^32-1 |
uint64 | 64位无符号整数 | 0到2^64-1 |
float32
:IEEE-754 32位浮点数float64
:IEEE-754 64位浮点数(默认)bool
类型只有true
和false
两个值。
字符串是不可变的字节序列,使用UTF-8编码。
s := "Hello, 世界"
fmt.Println(len(s)) // 输出:13(字节长度)
// 连接
s1 := "Hello"
s2 := "World"
s3 := s1 + " " + s2
// 切片
fmt.Println(s3[0:5]) // "Hello"
// 遍历
for i, r := range "Hello, 世界" {
fmt.Printf("%d\t%q\t%d\n", i, r, r)
}
if x > 10 {
fmt.Println("x is greater than 10")
} else if x > 5 {
fmt.Println("x is greater than 5")
} else {
fmt.Println("x is 5 or less")
}
// 带初始化语句
if score := 85; score >= 90 {
fmt.Println("A")
}
grade := 'B'
switch grade {
case 'A':
fmt.Println("Excellent")
case 'B':
fmt.Println("Good")
default:
fmt.Println("Invalid grade")
}
// 无表达式switch
score := 85
switch {
case score >= 90:
fmt.Println("A")
case score >= 80:
fmt.Println("B")
default:
fmt.Println("C")
}
Go只有for
循环一种循环结构。
for i := 0; i < 10; i++ {
fmt.Println(i)
}
sum := 1
for sum < 1000 {
sum += sum
}
for {
// 无限循环
}
nums := []int{2, 3, 4}
for i, num := range nums {
fmt.Printf("index: %d, value: %d\n", i, num)
}
break
:终止循环continue
:跳过当前循环goto
:跳转到标签(慎用)for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
func functionName(parameter1 type1, parameter2 type2) returnType {
// 函数体
return value
}
示例:
func add(a int, b int) int {
return a + b
}
// 多返回值
func swap(x, y string) (string, string) {
return y, x
}
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return // 裸返回
}
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
固定长度的相同类型元素序列。
var a [5]int
b := [3]int{1, 2, 3}
c := [...]int{1, 2, 3} // 编译器确定长度
动态数组,更灵活。
// 创建切片
s := []int{1, 2, 3}
s = append(s, 4) // 添加元素
// 从数组创建
arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:4] // [2,3,4]
// 使用make创建
s2 := make([]int, 0, 5) // 长度0,容量5
// 遍历
for i, v := range s {
fmt.Println(i, v)
}
// 复制
copy(s1, s2)
// 删除元素
s = append(s[:2], s[3:]...)
键值对集合。
// 创建
m := make(map[string]int)
m["Alice"] = 25
// 字面量
ages := map[string]int{
"Alice": 25,
"Bob": 30,
}
// 操作
delete(ages, "Alice") // 删除
age, ok := ages["Bob"] // 检查存在
自定义复合类型。
type Person struct {
Name string
Age int
}
// 初始化
p1 := Person{"Alice", 25}
p2 := Person{Name: "Bob", Age: 30}
// 访问字段
fmt.Println(p1.Name)
Go支持指针,但不支持指针运算。
var p *int
i := 42
p = &i
fmt.Println(*p) // 通过指针读取i的值
*p = 21 // 通过指针设置i的值
Go没有类,但可以为类型定义方法。
type Vertex struct {
X, Y float64
}
// 方法接收者
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
// 指针接收者
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
接口定义了一组方法的集合。
type Shape interface {
Area() float64
Perimeter() float64
}
type Rect struct {
width, height float64
}
func (r Rect) Area() float64 {
return r.width * r.height
}
func (r Rect) Perimeter() float64 {
return 2 * (r.width + r.height)
}
轻量级线程,由Go运行时管理。
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world") // 启动goroutine
say("hello")
}
goroutine之间的通信机制。
ch := make(chan int)
// 发送
go func() {
ch <- 42
}()
// 接收
value := <-ch
// 带缓冲的channel
ch := make(chan int, 2)
ch <- 1
ch <- 2
select {
case msg1 := <-ch1:
fmt.Println("received", msg1)
case msg2 := <-ch2:
fmt.Println("received", msg2)
case <-time.After(time.Second):
fmt.Println("timeout")
default:
fmt.Println("no messages")
}
Go使用返回值而不是异常来处理错误。
f, err := os.Open("filename.ext")
if err != nil {
log.Fatal(err)
}
defer f.Close()
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
import (
"fmt"
"math/rand"
"github.com/user/stringutil"
)
初始化模块
go mod init example.com/hello
添加依赖
go get github.com/some/package
fmt
:格式化I/Oos
:操作系统功能io
:基本I/O接口net
:网络I/Ohttp
:HTTP协议实现encoding/json
:JSON编码解码time
:时间处理sync
:同步原语命名规范:
错误处理:
并发安全:
性能优化:
Go语言以其简洁的语法和强大的并发支持,已经成为现代软件开发的重要工具。本文详细介绍了Go语言的基本语法,包括:
掌握这些基础语法是学习Go语言的第一步。在实际开发中,还需要深入了解标准库的使用、性能优化技巧以及Go语言的惯用法。Go语言的官方文档和源代码是进一步学习的最佳资源。
注意:本文约4800字,详细介绍了Go语言的基本语法要点。实际开发中,建议结合官方文档和实际项目练习来巩固这些知识。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。