Go 语言零基础入门核心知识点详解
Go 语言零基础入门教程涵盖环境搭建、基础语法、核心特性及实战应用。内容包括变量类型、条件循环、函数定义,重点讲解切片、映射、结构体与错误处理机制。通过内置 HTTP 库与 Gin 框架实现接口开发,结合 GORM 操作 MySQL 数据库。适合初学者快速掌握 Go 语言核心能力,为高并发后端开发打下基础。

Go 语言零基础入门教程涵盖环境搭建、基础语法、核心特性及实战应用。内容包括变量类型、条件循环、函数定义,重点讲解切片、映射、结构体与错误处理机制。通过内置 HTTP 库与 Gin 框架实现接口开发,结合 GORM 操作 MySQL 数据库。适合初学者快速掌握 Go 语言核心能力,为高并发后端开发打下基础。

Go(又称 Golang)是谷歌推出的编程语言,在云原生、高并发后端开发中应用广泛。特点包括:
| 工具 | 作用 | 安装要点 |
|---|---|---|
| Go | Go 语言核心环境 | 官网下载对应系统版本,自动配置环境变量 |
| IDE | 写 Go 代码的编辑器 | 新手首选 GoLand 或 VS Code+Go 插件 |
| Git | 代码版本管理 | 官网下载安装 |
| Postman | 调试接口用 | 免费版足够 |
打开命令行输入以下命令,能输出版本号即为成功:
# 查看 Go 版本
go version
// 声明包名:main 包是可执行程序的入口包
package main
// 导入 fmt 包(格式化输入输出)
import "fmt"
// main 函数:程序入口,固定写法
func main() {
// 打印到控制台(双引号包裹字符串)
fmt.Println("你好,Go!")
}
# 方式 1:直接运行(开发时用)
go run hello.go
# 方式 2:先编译成可执行文件,再运行(部署时用)
go build hello.go
./hello
# Windows 下执行 hello.exe
.go,必须以 package 开头(main 包才能独立运行);import,比如 fmt 是系统内置的'输入输出包';func 定义,main() 是程序唯一入口,没有返回值;{} 包裹,左大括号必须和函数名同行(Go 的强制规范);| 类型 | 用途 | 示例 |
|---|---|---|
| int | 整数 | var age int = 18 |
| float64 | 小数 | var salary float64 = 8000.5 |
| string | 字符串 | var name string = "小明" |
| bool | 布尔值 | var isAdult bool = true |
| []T | 切片 | var scores []int = []int{90, 85, 95} |
package main
import "fmt"
func main() {
// 方式 1:完整声明
var name string = "小明"
var age int = 18
fmt.Println("方式 1:", name, age)
// 方式 2:类型推导
var score = 92.5 // 自动识别为 float64
fmt.Println("方式 2:", score)
// 方式 3:简短声明(函数内专用,最常用)
isPass := score >= 60 // 等价于 var isPass bool = true
fmt.Println("方式 3:", isPass)
}
:= 只能在函数内用,全局变量必须用 var;+ 号。package main
import "fmt"
func main() {
score := 85
// Go 的 if 不用加 (),代码块必须加 {}
if score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
// Go 特色:if 可以先执行语句,再判断
if num := score / 10; num == 9 {
fmt.Println("90 分以上")
}
}
package main
import "fmt"
func main() {
// 打印 1-10 的数字
for i := 1; i <= 10; i++ {
fmt.Println(i)
}
// 计算 1-100 的和
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
fmt.Println("1-100 的和:", sum)
}
i := 1
for i <= 5 {
fmt.Println(i)
i++
}
break 终止循环,continue 跳过当前次循环。package main
import "fmt"
// 定义函数:计算切片的平均分
func calculateAvg(scores []int) float64 {
sum := 0
// range 遍历切片,返回索引和值
for _, score := range scores {
sum += score
}
return float64(sum) / float64(len(scores))
}
func main() {
scores := []int{80, 90, 85, 95}
avg := calculateAvg(scores)
fmt.Printf("平均分:%.1f\n", avg)
}
func,参数格式是'参数名 类型';range 返回'索引 + 值',用 _ 忽略不需要的返回值;Java 的数组长度固定,Go 的切片可以动态扩容,是 Go 最核心的容器类型。
package main
import "fmt"
func main() {
// 方式 1:直接创建切片
s1 := []int{1, 2, 3, 4}
fmt.Println("切片 s1:", s1)
// 方式 2:make 创建
s2 := make([]string, 0, 5)
s2 = append(s2, "Java", "Go", "Python")
fmt.Println("切片 s2:", s2)
// 切片截取(左闭右开)
s3 := s1[1:3]
fmt.Println("切片 s3:", s3)
// 遍历切片
for index, value := range s2 {
fmt.Printf("索引:%d,值:%s\n", index, value)
}
}
append 函数会返回新切片,必须赋值给原变量;package main
import "fmt"
func main() {
// 方式 1:直接创建 map
scoreMap := map[string]int{
"小明": 90,
"小红": 85,
"小李": 95,
}
fmt.Println("小明的成绩:", scoreMap["小明"])
// 方式 2:make 创建
userMap := make(map[int]string, 10)
userMap[1] = "张三"
userMap[2] = "李四"
// 判断 key 是否存在
score, ok := scoreMap["小王"]
if ok {
fmt.Println("小王的成绩:", score)
} else {
fmt.Println("小王不存在")
}
// 删除元素
delete(scoreMap, "小红")
fmt.Println("删除小红后:", scoreMap)
}
map[键类型] 值类型;value, ok := map[key] 判断 key 是否存在;Go 没有'类'的概念,用结构体实现面向对象。
package main
import "fmt"
// 定义结构体
type Student struct {
Name string
Age int
Score float64
}
// 给结构体绑定方法
func (s Student) PrintInfo() {
fmt.Printf("姓名:%s,年龄:%d,成绩:%.1f\n", s.Name, s.Age, s.Score)
}
func (s *Student) UpdateScore(newScore float64) {
s.Score = newScore
}
func main() {
stu1 := Student{Name: "小明", Age: 18, Score: 90.0}
stu1.PrintInfo()
stu1.UpdateScore(95.0)
stu1.PrintInfo()
}
Go 没有 try/catch,用返回值 error 处理错误。
package main
import "fmt"
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("除数不能为 0")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("出错了:", err)
return
}
fmt.Println("结果:", result)
}
err != nil;fmt.Errorf 或 errors.New。package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
fmt.Fprintf(w, `{"code":200,"msg":"你好,Go HTTP!"}`)
}
func studentHandler(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
w.Header().Set("Content-Type", "application/json; charset=utf-8")
fmt.Fprintf(w, `{"code":200,"data":{"id":"%s","name":"小明","age":18}}`, id)
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.HandleFunc("/student", studentHandler)
fmt.Println("服务器启动:http://localhost:8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("服务器启动失败:", err)
}
}
net/http 库,不用装任何框架就能写接口;func(w http.ResponseWriter, r *http.Request)。go get -u github.com/gin-gonic/[email protected]
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Student struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Score float64 `json:"score"`
}
func main() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"code": 200, "msg": "你好,Gin!"})
})
r.Run(":8080")
}
gin.H 是快捷的 map 类型;json:"id" 标签用来指定 JSON 字段名。go get -u gorm.io/[email protected]
go get -u gorm.io/driver/mysql
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Student struct {
ID int `gorm:"primaryKey;autoIncrement" json:"id"`
Name string `gorm:"size:20;not null" json:"name"`
Age int `gorm:"default:0" json:"age"`
Score float64 `json:"score"`
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败:" + err.Error())
}
db.AutoMigrate(&Student{})
stu := Student{Name: "小明", Age: 18, Score: 90.0}
result := db.Create(&stu)
if result.Error != nil {
fmt.Println("新增失败:", result.Error)
} else {
fmt.Println("新增成功,ID:", stu.ID)
}
}
gorm:"primaryKey" 指定数据库表的字段属性。_ 忽略;:= 用在函数外 → ✅ 全局变量必须用 var 声明;err != nil;
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online