1450 字
7 分钟
260714GO基础语法

GO语言基础语法#

一、标准输出#

  • fmt.Println:打印后自动换行,多个参数之间用空格分隔
  • fmt.Print:打印后不换行
  • fmt.Printf:格式化输出,和 C 语言的 printf 类似,需手动加 \n 换行

常用格式化占位符#

  • %d:整数
  • %s:字符串
  • %f:浮点数
    • 示例:fmt.Printf("pi = %.2f\n", pi) 保留2位小数
  • %c:打印字符
  • %v:万能占位符,适配任意类型
fmt.Println(10, 20, "hello") // 自动换行,参数间空格分隔
fmt.Print(10, 20, "hello") // 不换行,参数间空格分隔
fmt.Printf("a = %d, b = %d\n", 10, 20) // 格式化模板输出

二、读取输入#

1. fmt.Scan#

  • 以空格/换行作为分隔符读取输入
  • 变量前必须加 & 传地址
var name string
var age int
fmt.Scan(&name, &age)
fmt.Println("姓名:", name)
fmt.Println("年龄:", age)
  • 返回值:(n int, err error)
    • n:成功读取的变量个数
    • err:读取错误(正常为 nil
    • _:空白标识符,用于丢弃不需要的返回值

循环读取直到 EOF#

package main
import "fmt"
func main() {
var a, b int
for {
n, err := fmt.Scan(&a, &b)
if n != 2 || err != nil {
break
}
fmt.Println(a + b)
}
}

2. 读取整行(含空格)bufio.Scanner#

package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan() // 读取一整行
line := scanner.Text()
fmt.Println(line)
}

三、& 和 * 运算符#

1. & 取地址运算符#

  • &变量:获取变量内存地址,生成指针
    • 例:var a int; p := &ap 类型为 *int
    • 作用:传递原始变量地址,允许函数修改原变量(不是副本)
    • 关键:fmt.Scan 需要指针参数才能正确写入值,不能直接传变量本身

2. * 解引用运算符#

  • *指针变量:访问/修改指针指向的原始变量

    var a int
    p := &a
    *p = 100 // 通过指针修改原变量 a
    fmt.Println(a) // 输出 100
    • 类型声明写法:var p *int 表示 int 指针类型(和表达式解引用语法不同)
  • &x:取 x 的地址 → 生成指针
  • *p:顺着指针地址访问原值

四、变量与数据类型#

1. 基础类型#

  • bool:布尔(true / false
  • string:UTF-8 字符串
  • 整数:int / int8 / int16 / int32 / int64 / uint / uint8(byte) / uint16 / uint32 / uint64 / uintptr
  • runeint32 别名,用于 Unicode 字符
  • 浮点数:float32 / float64
  • 复数:complex64 / complex128

2. 复合类型#

  • 数组 [N]T:固定长度,值类型
  • 切片 []T:动态数组,引用类型(需 make)
  • Map map[KeyType]ValueType:哈希映射,引用类型(需 make)
  • Struct:结构体,自定义聚合类型
  • Channel chan T:通道,goroutine 通信(需 make)
  • Pointer *T:指针类型
  • Function:函数类型
  • Interface:接口类型

3. 变量规则#

  • Go 强制要求:声明变量必须使用,否则编译报错
  • 临时忽略值:用空白标识符 _

4. 常量 const#

const MaxSize = 100
const Pi = 3.14159
  • 常量定义后不可修改

5. 显式类型转换#

Go 无隐式自动类型转换,必须显式转换

a := 42
b := float64(a)
fmt.Println(b)
c := 3.99
d := int(c) // 截断小数,不是四舍五入 → 结果 3
fmt.Println(d)
// 整数除法坑
x, y := 1, 2
fmt.Println(x / y) // int除法:0
fmt.Println(float64(x) / float64(y))// 浮点数除法:0.5
var e int = 100
var f int64 = int64(e)
fmt.Println(f)
// 数值转字符串
num := 42
s := fmt.Sprintf("%d", num)
fmt.Printf("%s (string)\n", s)

五、运算符#

1. 算术运算符#

a, b := 17, 5
fmt.Println(a + b) // 加法
fmt.Println(a - b) // 减法
fmt.Println(a * b) // 乘法
fmt.Println(a / b) // 整数除法,截断小数
fmt.Println(a % b) // 取余
// 自增/自减:只能独立语句,不能嵌入表达式
c := 10
c++
fmt.Println(c)
c--
fmt.Println(c)
// 复合赋值
c += 5
c *= 2

2. 比较 & 逻辑运算符#

a, b := 10, 20
// 比较
fmt.Println(a == b)
fmt.Println(a != b)
fmt.Println(a < b)
// 逻辑
fmt.Println(a > 5 && b > 15) // && 并且
fmt.Println(a > 100 || b > 15) // || 或者
fmt.Println(!(a > 5)) // ! 取反
  • ❗ Go 没有三元运算符 ?:,只能用 if-else
    var max int
    if a > b {
    max = a
    } else {
    max = b
    }

3. 位运算#

a := 10 // 1010
b := 12 // 1100
fmt.Println(a & b) // 按位与
fmt.Println(a | b) // 按位或
fmt.Println(a ^ b) // 按位异或
fmt.Println(a << 1) // 左移(×2)
fmt.Println(a >> 1) // 右移(÷2)
// 判断奇偶
n := 7
if n&1 == 1 {
fmt.Printf("%d 是奇数\n", n)
}

六、控制流#

1. if / else 条件判断#

  • 条件不用括号 (),左大括号 { 必须和 if 同行
  • 支持前置局部变量声明
score := 85
if score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
// 前置变量写法
if num := 10; num%2 == 0 {
fmt.Println("偶数")
}

2. for 循环(Go 唯一循环语句)#

// 写法1:经典for
for i := 0; i < 5; i++ {
fmt.Print(i, " ")
}
fmt.Println()
// 写法2:类while
sum := 0
i := 1
for i <= 100 {
sum += i
i++
}
fmt.Println(sum)
// 写法3:无限循环
count := 0
for {
count++
if count >= 3 {
break
}
}
fmt.Println(count)

3. range 遍历#

返回:索引 i, 元素值 v

nums := [5]int{10, 20, 30, 40, 50}
// 完整接收索引和值
for i, v := range nums {
fmt.Printf("索引 %d:值 %d\n", i, v)
}
// 只取值,用 _ 忽略索引
for _, v := range nums {
fmt.Print(v, " ")
}
fmt.Println()
// 只取索引
for i := range nums {
fmt.Print(i, " ")
}
fmt.Println()

4. break / continue#

  • break:跳出整个循环
  • continue:跳过本轮循环,直接进入下一轮
// break 示例
for i := 1; i <= 100; i++ {
if i%7 == 0 {
fmt.Println("第一个能被7整除的数:", i)
break
}
}
// continue 示例
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue
}
fmt.Print(i, " ")
}

5. switch#

  • 默认自动 break,不会穿透 case
  • 可多值匹配,也可无表达式作为 if-else 链使用
var day int
fmt.Scan(&day)
switch day {
case 1:
fmt.Println("星期一")
case 2:
fmt.Println("星期二")
case 3:
fmt.Println("星期三")
case 6, 7:
fmt.Println("周末")
default:
fmt.Println("其他工作日")
}
// 无表达式 switch
score := 85
switch {
case score >= 90:
fmt.Println("优秀")
case score >= 60:
fmt.Println("及格")
default:
fmt.Println("不及格")
}
260714GO基础语法
https://fuwari.vercel.app/posts/260714go基础语法/
作者
anh
发布于
2026-07-14
许可协议
CC BY-NC-SA 4.0