Go 基础语法

程序结构

Hello World 程序

// 这是注释
package main  // 包声明,main 包是可执行程序的入口
 
import "fmt"  // 导入标准库 fmt
 
// main 函数是程序的入口点
func main() {
    fmt.Println("Hello, World!")  // 打印输出
}

程序组成部分

  1. 包声明package main - 声明包名
  2. 导入语句import "fmt" - 导入需要的包
  3. 函数func main() - 定义函数
  4. 语句fmt.Println(...) - 执行语句

注释

// 单行注释
 
/*
多行注释
可以写多行
*/
 
// 文档注释(用于生成文档)
// Package main 提供程序入口
// 这是包级别的文档注释
package main
 
// Add 函数用于计算两个数的和
// 参数 a 和 b 是要相加的两个整数
// 返回 a 和 b 的和
func Add(a, b int) int {
    return a + b
}

标识符和关键字

标识符规则

// 标识符(变量名、函数名等)规则:
// 1. 必须以字母或下划线开头
// 2. 后面可以跟字母、数字、下划线
// 3. 区分大小写
 
var name string      // 正确
var _name string     // 正确
var name123 string   // 正确
var 123name string   // 错误:不能以数字开头
var my-name string   // 错误:不能包含连字符

关键字

// Go 的关键字(不能用作标识符):
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

预定义标识符

// 预定义标识符(可以重新定义,但不推荐):
// 类型:bool, byte, complex64, complex128, error, float32, float64
//      int, int8, int16, int32, int64, rune, string, uint, uint8,
//      uint16, uint32, uint64, uintptr
// 常量:true, false, iota, nil
// 函数:append, cap, close, complex, copy, delete, imag, len,
//      make, new, panic, print, println, real, recover

变量声明

使用 var 声明

// 方式一:声明后赋值
var name string
name = "Go"
 
// 方式二:声明时赋值
var name string = "Go"
 
// 方式三:类型推断(省略类型)
var name = "Go"  // 自动推断为 string
 
// 方式四:声明多个变量
var (
    name string = "Go"
    age  int    = 10
    isOk bool   = true
)
 
// 方式五:声明多个同类型变量
var x, y int = 1, 2

使用 := 短变量声明

// := 只能在函数内部使用
func main() {
    name := "Go"        // 等价于 var name string = "Go"
    age := 10           // 等价于 var age int = 10
    x, y := 1, 2        // 声明多个变量
    a, b := 1, "hello"  // 不同类型
    
    // 注意::= 至少有一个新变量
    x, y := 3, 4  // 错误:x, y 都已存在
    x, z := 3, 4  // 正确:z 是新变量
}

变量作用域

package main
 
var globalVar = "全局变量"  // 包级别变量
 
func main() {
    var localVar = "局部变量"  // 函数级别变量
    
    {
        var blockVar = "块级别变量"  // 块级别变量
        fmt.Println(blockVar)      // 可以访问
    }
    
    // fmt.Println(blockVar)  // 错误:blockVar 不在作用域内
    fmt.Println(localVar)    // 可以访问
    fmt.Println(globalVar)   // 可以访问
}

常量

常量声明

// 使用 const 声明常量
const Pi = 3.14159
 
// 声明多个常量
const (
    StatusOK    = 200
    StatusError = 500
)
 
// 常量组(如果省略值,则使用上一行的值)
const (
    a = 1  // a = 1
    b      // b = 1
    c      // c = 1
)
 
// iota:常量生成器
const (
    Sunday = iota  // 0
    Monday         // 1
    Tuesday        // 2
    Wednesday      // 3
    Thursday       // 4
    Friday         // 5
    Saturday       // 6
)
 
// iota 高级用法
const (
    _  = iota             // 忽略第一个值
    KB = 1 << (10 * iota) // 1024
    MB                    // 1048576
    GB                    // 1073741824
    TB                    // 1099511627776
)

基本数据类型

布尔类型

var isTrue bool = true
var isFalse bool = false
 
// 布尔类型的零值是 false
var zero bool  // zero = false

整数类型

// 有符号整数
var i8  int8   // -128 到 127
var i16 int16  // -32768 到 32767
var i32 int32  // -2147483648 到 2147483647
var i64 int64  // -9223372036854775808 到 9223372036854775807
var i   int    // 32 或 64 位,取决于平台
 
// 无符号整数
var u8  uint8   // 0 到 255
var u16 uint16  // 0 到 65535
var u32 uint32  // 0 到 4294967295
var u64 uint64  // 0 到 18446744073709551615
var u   uint    // 32 或 64 位,取决于平台
 
// 特殊类型
var b byte = 255  // uint8 的别名
var r rune = '' // int32 的别名,用于 Unicode 字符

浮点数类型

var f32 float32 = 3.14
var f64 float64 = 3.141592653589793
 
// 科学计数法
var num1 = 1.23e4   // 12300
var num2 = 1.23e-4  // 0.000123

复数类型

var c64 complex64  = 1 + 2i
var c128 complex128 = 1 + 2i
 
// 创建复数
var c1 = complex(1, 2)  // 1 + 2i
var c2 = complex(3, 4)  // 3 + 4i
 
// 获取实部和虚部
realPart := real(c1)  // 1
imagPart := imag(c1)  // 2

字符串类型

// 字符串是不可变的字节序列
var str1 string = "Hello"
var str2 = "World"
 
// 多行字符串
var multiLine = `这是
多行
字符串`
 
// 字符串连接
var combined = str1 + " " + str2  // "Hello World"
 
// 字符串长度
length := len("Hello")  // 5
 
// 字符串索引(返回字节)
firstByte := "Hello"[0]  // 72 (H 的 ASCII 码)
 
// 字符串切片
substr := "Hello"[1:3]  // "el"

零值

// 每种类型都有零值(默认值)
var i int       // 0
var f float64   // 0.0
var b bool      // false
var s string    // ""
var p *int      // nil
var sl []int    // nil
var m map[string]int  // nil
var ch chan int       // nil

类型转换

// Go 是强类型语言,需要显式类型转换
var i int = 42
var f float64 = float64(i)  // int 转 float64
var u uint = uint(f)        // float64 转 uint
 
// 字符串转换
import "strconv"
 
// 数字转字符串
str := strconv.Itoa(123)        // "123"
str2 := strconv.FormatInt(123, 10)  // "123"
 
// 字符串转数字
num, err := strconv.Atoi("123")     // 123, nil
num2, err := strconv.ParseInt("123", 10, 64)  // 123, nil
 
// 字符串和字节切片
str := "Hello"
bytes := []byte(str)  // []byte{'H', 'e', 'l', 'l', 'o'}
str2 := string(bytes) // "Hello"

运算符

算术运算符

a, b := 10, 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 = 11(只有后置)
a--  // a = 10(只有后置)

比较运算符

a, b := 10, 20
 
fmt.Println(a == b)  // false  相等
fmt.Println(a != b)  // true   不等
fmt.Println(a < b)   // true   小于
fmt.Println(a > b)   // false  大于
fmt.Println(a <= b)  // true   小于等于
fmt.Println(a >= b)  // false  大于等于

逻辑运算符

a, b := true, false
 
fmt.Println(a && b)  // false  逻辑与
fmt.Println(a || b)  // true   逻辑或
fmt.Println(!a)      // false  逻辑非

位运算符

a, b := 5, 3  // 二进制:101, 011
 
fmt.Println(a & b)   // 1   按位与 (001)
fmt.Println(a | b)   // 7   按位或 (111)
fmt.Println(a ^ b)   // 6   按位异或 (110)
fmt.Println(^a)      // -6  按位取反
fmt.Println(a << 1) // 10  左移 (1010)
fmt.Println(a >> 1) // 2   右移 (10)

赋值运算符

a := 10
 
a += 5   // a = a + 5  (15)
a -= 3   // a = a - 3  (12)
a *= 2   // a = a * 2  (24)
a /= 4   // a = a / 4  (6)
a %= 4   // a = a % 4  (2)
a <<= 1  // a = a << 1 (4)
a >>= 1  // a = a >> 1 (2)
a &= 3   // a = a & 3  (2)
a |= 1   // a = a | 1  (3)
a ^= 2   // a = a ^ 2  (1)

指针

// 指针存储变量的内存地址
var x int = 42
var p *int = &x  // p 是指向 x 的指针
 
fmt.Println(x)   // 42   值
fmt.Println(p)   // 0xc0000140a0  地址
fmt.Println(*p)  // 42   解引用(获取指针指向的值)
 
// 通过指针修改值
*p = 100
fmt.Println(x)   // 100
 
// 空指针
var nilPtr *int = nil
// fmt.Println(*nilPtr)  // 运行时错误:空指针解引用

总结

Go 的基础语法特点:

  1. 简洁明了:语法简单,易于学习
  2. 类型安全:静态类型,编译时检查
  3. 零值概念:每个类型都有默认零值
  4. 指针支持:可以操作内存地址
  5. 强类型:需要显式类型转换

掌握这些基础语法后,就可以开始编写 Go 程序了!


go 基础语法 变量 常量 类型