第2章:Go语言基础语法

第2章:Go语言基础语法

1. 变量和数据类型

1.1 基本数据类型

Go语言提供了以下基本数据类型:

go 复制代码
// 整数类型
var intVar1 int    // 根据系统位数,32或64位
var intVar2 int8   // -128 到 127
var intVar3 int16  // -32768 到 32767
var intVar4 int32  // -2^31 到 2^31-1
var intVar5 int64  // -2^63 到 2^63-1

// 无符号整数类型
var uintVar1 uint    // 32或64位
var uintVar2 uint8   // 0 到 255
var uintVar3 uint16  // 0 到 65535
var uintVar4 uint32  // 0 到 2^32-1
var uintVar5 uint64  // 0 到 2^64-1

// 浮点数类型
var floatVar1 float32  // 32位浮点数
var floatVar2 float64  // 64位浮点数

// 布尔类型
var boolVar bool  // true 或 false

// 字符串类型
var strVar string  // 字符串

// 字符类型(实际是int32的别名)
var charVar rune   // Unicode字符

1.2 变量声明和初始化

Go语言提供多种变量声明方式:

go 复制代码
// 方式1:完整声明
var name string = "张三"

// 方式2:类型推断
var age = 25  // 自动推断为int

// 方式3:短变量声明(只能在函数内使用)
username := "admin"

// 多变量声明
var x, y int = 10, 20

// 批量声明
var (
    width  = 100
    height = 200
)

1.3 类型转换

go 复制代码
// 基本类型转换
var intVar int = 42
var floatVar float64 = float64(intVar)  // 显式转换

// 字符串转换
ageStr := "25"
age, err := strconv.Atoi(ageStr)  // 字符串转整数
if err != nil {
    fmt.Println("转换错误:", err)
}

// 整数转字符串
numStr := strconv.Itoa(age)

2. 运算符

2.1 算术运算符

go 复制代码
a := 10
b := 3

fmt.Println("加法:", a + b)    // 13
fmt.Println("减法:", a - b)    // 7
fmt.Println("乘法:", a * b)    // 30
fmt.Println("除法:", a / b)    // 3
fmt.Println("取模:", a % b)    // 1

// 自增和自减(只能作为独立语句)
a++  // 等价于 a = a + 1
b--  // 等价于 b = b - 1

2.2 比较运算符

go 复制代码
x := 5
y := 10

fmt.Println("等于:", x == y)       // false
fmt.Println("不等于:", x != y)     // true
fmt.Println("大于:", x > y)        // false
fmt.Println("小于:", x < y)        // true
fmt.Println("大于等于:", x >= y)    // false
fmt.Println("小于等于:", x <= y)    // true

2.3 逻辑运算符

go 复制代码
isTrue := true
isFalse := false

fmt.Println("与运算:", isTrue && isFalse)   // false
fmt.Println("或运算:", isTrue || isFalse)   // true
fmt.Println("非运算:", !isTrue)             // false

3. 控制流

3.1 if/else语句

go 复制代码
// 基本if语句
score := 85
if score >= 90 {
    fmt.Println("优秀")
} else if score >= 60 {
    fmt.Println("及格")
} else {
    fmt.Println("不及格")
}

// 带初始化的if语句
if num := getValue(); num > 0 {
    fmt.Println("正数")
}

3.2 switch语句

go 复制代码
// 基本switch
day := 3
switch day {
case 1:
    fmt.Println("星期一")
case 2:
    fmt.Println("星期二")
default:
    fmt.Println("其他日期")
}

// 多条件switch
switch x := 5; x {
case 1, 3, 5:
    fmt.Println("奇数")
case 2, 4, 6:
    fmt.Println("偶数")
default:
    fmt.Println("未知")
}

// 不带条件的switch
switch {
case x > 0:
    fmt.Println("正数")
case x < 0:
    fmt.Println("负数")
default:
    fmt.Println("零")
}

3.3 for循环

go 复制代码
// 基本for循环
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// while类型循环
j := 0
for j < 5 {
    fmt.Println(j)
    j++
}

// 无限循环
for {
    // 执行操作
    // break可以退出循环
}

// 遍历数组/切片
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("索引:%d, 值:%d\n", index, value)
}

4. 函数

4.1 函数定义和调用

go 复制代码
// 基本函数
func add(a int, b int) int {
    return a + b
}

// 调用函数
result := add(10, 20)
fmt.Println(result)  // 30

4.2 多返回值

go 复制代码
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("除数不能为零")
    }
    return a / b, nil
}

quotient, err := divide(10, 2)
if err != nil {
    fmt.Println("错误:", err)
} else {
    fmt.Println("结果:", quotient)
}

4.3 匿名函数和闭包

go 复制代码
// 匿名函数
greet := func(name string) {
    fmt.Println("Hello,", name)
}
greet("Go")

// 闭包示例
func counter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}

nextCount := counter()
fmt.Println(nextCount())  // 1
fmt.Println(nextCount())  // 2

4.4 递归函数

go 复制代码
// 阶乘递归
func factorial(n int) int {
    if n <= 1 {
        return 1
    }
    return n * factorial(n-1)
}

fmt.Println(factorial(5))  // 120
相关推荐
Q_19284999066 分钟前
基于Django的农业管理系统
后端·python·django
棋丶10 分钟前
VUE2和VUE3的区别
开发语言·前端·javascript
Q_192849990616 分钟前
基于Spring Boot的爱记笔记网站
java·spring boot·后端
Q_192849990619 分钟前
基于Spring Boot的仓库租赁管理系统
java·spring boot·后端
Pandaconda31 分钟前
【Golang 面试题】每日 3 题(二十三)
开发语言·后端·面试·golang·go·channel
sun00770033 分钟前
C++中,typename
开发语言·c++
云妙算36 分钟前
手把手带你使用Karpenter减少K8s集群资源浪费
后端·kubernetes
小码编匠37 分钟前
最好用的 WPF 加载动画功能
后端·c#·.net
前端工作日常42 分钟前
Maven的安装和执行
后端
C++小厨神1 小时前
Go语言的数据库交互
开发语言·后端·golang