Go 语言基础语法

Go 语言基础语法

  • [Go 语言基础语法](#Go 语言基础语法)
    • [1. 包声明与导入](#1. 包声明与导入)
    • [2. 变量声明](#2. 变量声明)
    • [3. 基本数据类型](#3. 基本数据类型)
    • [4. 常量](#4. 常量)
    • [5. 控制流](#5. 控制流)
      • [if / else](#if / else)
      • [for(Go 唯一的循环关键字)](#for(Go 唯一的循环关键字))
      • switch
    • [6. 函数](#6. 函数)
    • [7. 指针](#7. 指针)
    • [8. 数组、切片、映射](#8. 数组、切片、映射)
    • [9. 结构体与方法](#9. 结构体与方法)
    • [10. 接口(隐式实现)](#10. 接口(隐式实现))
    • [11. 错误处理](#11. 错误处理)
    • [12. goroutine 与 channel(并发基础)](#12. goroutine 与 channel(并发基础))
    • 关键特性总结

Go 语言基础语法

1. 包声明与导入

go 复制代码
package main

import (
    "fmt"
    "strings"
)
  • 每个 .go 文件必须属于一个 package
  • 可执行程序入口是 package main + func main()
  • 多个包用 () 分组导入

2. 变量声明

go 复制代码
// 显式声明
var name string = "Go"
var age int = 10

// 类型推断
var name = "Go"       // 自动推断 string
age := 10             // 短声明,只能在函数内使用

// 批量声明
var (
    x int    = 1
    y string = "hello"
)

零值机制 :未赋值的变量自动初始化为类型的零值(0""falsenil)。


3. 基本数据类型

类型 示例
bool true, false
int / int8 / int16 / int32 / int64 整数
uint / uintptr 无符号整数
float32 / float64 浮点数
byte (= uint8) 字节
rune (= int32) Unicode 码点
string 字符串(不可变)

4. 常量

go 复制代码
const Pi = 3.14

// 枚举
const (
    StatusOK   = 200
    StatusErr  = 500
    StatusNP   = iota // 0, 1, 2... 自动递增
)

5. 控制流

if / else

go 复制代码
if x > 0 {
    fmt.Println("positive")
} else if x == 0 {
    fmt.Println("zero")
} else {
    fmt.Println("negative")
}

// 带初始化语句(作用域仅限 if 块内)
if err := doSomething(); err != nil {
    log.Fatal(err)
}

for(Go 唯一的循环关键字)

go 复制代码
// 经典
for i := 0; i < 10; i++ { ... }

// 类 while
for i < 10 { ... }

// 死循环
for { ... }

// range 遍历
for idx, val := range slice { ... }   // idx 可用 _ 忽略
for key, val := range myMap { ... }

switch

go 复制代码
switch day {
case "Mon":
    fmt.Println("周一")
case "Tue", "Wed":
    fmt.Println("周中")
default:
    fmt.Println("其他")
}

// 无表达式:类似 if-else chain
switch {
case score >= 90:
    fmt.Println("A")
case score >= 60:
    fmt.Println("B")
}

6. 函数

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

// 多返回值(Go 惯用错误处理模式)
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

// 命名返回值
func rect(width, height float64) (area float64) {
    area = width * height
    return  // 自动返回 area
}

// 可变参数
func sum(nums ...int) int { ... }

7. 指针

go 复制代码
x := 10
p := &x       // 取地址
fmt.Println(*p) // 解引用 → 10
*p = 20       // 通过指针修改

Go 的指针不支持运算 (没有 p++),比 C 简单安全。


8. 数组、切片、映射

数组(固定长度)

go 复制代码
var arr [5]int = [5]int{1, 2, 3, 4, 5}

切片(动态长度,核心数据结构)

go 复制代码
s := []int{1, 2, 3}       // 字面量
s = append(s, 4)          // 追加
s2 := s[1:3]              // 切片操作 [low:high]

// make 创建
s3 := make([]int, 0, 10)  // 长度0,容量10

映射(Map)

go 复制代码
m := map[string]int{"Go": 10, "Python": 30}
m["Rust"] = 8

v, ok := m["Go"]  // ok 表示 key 是否存在
delete(m, "Python")

9. 结构体与方法

go 复制代码
type User struct {
    Name string
    Age  int
}

// 值接收者(不修改原对象)
func (u User) Greet() string {
    return "Hi, " + u.Name
}

// 指针接收者(可修改原对象)
func (u *User) SetAge(age int) {
    u.Age = age
}

10. 接口(隐式实现)

go 复制代码
type Speaker interface {
    Speak() string
}

type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }

// Dog 自动实现 Speaker,无需显式声明
var s Speaker = Dog{}

11. 错误处理

go 复制代码
if err := doWork(); err != nil {
    return fmt.Errorf("doWork failed: %w", err) // %w 包装错误链
}

Go 没有异常,用返回 error 值处理,这是语言设计哲学的核心。


12. goroutine 与 channel(并发基础)

go 复制代码
// 启动 goroutine
go func() {
    fmt.Println("concurrent")
}()

// channel
ch := make(chan int, 1) // 缓冲通道
ch <- 42                 // 发送
val := <-ch              // 接收

// select 多路复用
select {
case msg := <-ch1:
    fmt.Println(msg)
case msg := <-ch2:
    fmt.Println(msg)
case <-time.After(2 * time.Second):
    fmt.Println("timeout")
}

关键特性总结

特性 说明
编译型 直接编译为机器码,无运行时依赖
GC 内置垃圾回收
隐式接口 结构体只要实现了方法就自动满足接口
多返回值 天然支持 error 返回模式
无继承 组合优于继承,用嵌入(embedding)替代
goroutine 轻量级协程,CSP 并发模型
相关推荐
是宇写的啊1 小时前
SpringBoot 统一功能处理
java·spring boot·后端
meng_ser1 小时前
[NewStarCTF 2023 公开赛道]eazy_crt
开发语言·python
等....1 小时前
Spring Boot多模块项目部署
java·spring boot·后端
小短腿的代码世界1 小时前
QCefView深度解析:在Qt中嵌入Chromium的架构设计与性能优化实战
开发语言·qt·性能优化
小短腿的代码世界1 小时前
Qt反射机制深度解析:从QMetaObject到运行时类型推导的底层密码
开发语言·qt
水木流年追梦1 小时前
【python因果库实战26】逆概率加权模型1
开发语言·python·算法·leetcode
20岁30年经验的码农1 小时前
Spring Boot 配置文件生效规则
spring boot·后端·pycharm
BatyTao2 小时前
QT下载并安装
开发语言·qt