Go语言零基础入门指南(下篇)(go语言入门书)
liuian 2025-05-09 20:02 34 浏览
1. 并发编程
goroutine基础
Go版本:
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world") // 启动goroutine
say("hello")
}
对比Python线程:
import threading
def say(s):
for i in range(3):
time.sleep(0.1)
print(s)
threading.Thread(target=say, args=("world",)).start()
say("hello")
对比JavaScript异步:
async function say(s) {
for (let i = 0; i < 3; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
console.log(s);
}
}
say("world");
say("hello");
关键区别:
- goroutine比线程更轻量(初始仅2KB栈)
- Go运行时自动调度goroutine到OS线程
- 语法简单,只需go关键字
channel通信
Go版本:
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 发送结果到channel
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 从channel接收
fmt.Println(x, y, x+y)
}
对比Python多进程:
from multiprocessing import Pipe
def sum(s, conn):
conn.send(sum(s))
conn.close()
parent_conn, child_conn = Pipe()
p1 = Process(target=sum, args=(s[:len(s)//2], child_conn))
p2 = Process(target=sum, args=(s[len(s)//2:], child_conn))
p1.start(); p2.start()
print(parent_conn.recv(), parent_conn.recv())
关键区别:
- channel是Go内置的线程安全通信机制
- 可以带缓冲(make(chan int, 100))
- 支持关闭channel和range遍历
select多路复用
Go版本:
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
对比JavaScript Promise.race:
async function fibonacci(callback, quitSignal) {
let x = 0, y = 1;
while (true) {
const result = await Promise.race([
new Promise(res => callback(res, x)),
quitSignal
]);
if (result === 'quit') return;
[x, y] = [y, x + y];
}
}
关键区别:
- select可以同时监控多个channel
- 常用于超时控制:
select {
case res := <-c:
fmt.Println(res)
case <-time.After(1 * time.Second):
fmt.Println("timeout")
}
2. 文件操作与IO
文件读写
Go版本:
// 读取文件
data, err := os.ReadFile("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(data))
// 写入文件
err = os.WriteFile("output.txt", []byte("Hello"), 0644)
if err != nil {
log.Fatal(err)
}
对比Python:
with open('test.txt') as f:
data = f.read()
with open('output.txt', 'w') as f:
f.write("Hello")
对比JavaScript:
const fs = require('fs');
fs.readFile('test.txt', (err, data) => {
console.log(data.toString());
});
fs.writeFile('output.txt', 'Hello', err => {});
JSON处理
Go版本:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
// 编码
p := Person{"Alice", 25}
jsonData, _ := json.Marshal(p)
// 解码
var p2 Person
json.Unmarshal(jsonData, &p2)
对比Python:
import json
data = json.dumps({"name": "Alice", "age": 25})
p = json.loads(data)
对比JavaScript:
const data = JSON.stringify({name: "Alice", age: 25});
const p = JSON.parse(data);
关键区别:
- Go需要定义结构体对应JSON结构
- 字段标签控制JSON属性名
- 编解码可能返回错误需要处理
3. 测试与性能
单元测试
Go版本:
// math.go
func Add(a, b int) int {
return a + b
}
// math_test.go
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Expected 5, got %d", result)
}
}
运行测试:
go test
对比Python unittest:
import unittest
def add(a, b):
return a + b
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
基准测试
Go版本:
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
运行基准测试:
go test -bench=.
4. 项目实践
简单HTTP服务
Go版本:
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", helloHandler)
http.ListenAndServe(":8080", nil)
}
对比Python Flask:
from flask import Flask
app = Flask(__name__)
@app.route('/<name>')
def hello(name):
return f"Hello, {name}!"
app.run(port=8080)
对比JavaScript Express:
const express = require('express');
const app = express();
app.get('/:name', (req, res) => {
res.send(`Hello, ${req.params.name}!`);
});
app.listen(8080);
项目结构建议
典型Go项目布局:
myapp/
├── cmd/
│ └── myapp/
│ └── main.go
├── internal/
│ ├── handler/
│ ├── service/
│ └── repository/
├── pkg/
│ └── utils/
├── go.mod
├── go.sum
└── README.md
进一步学习资源
- 官方文档:https://golang.org/doc/
- 标准库参考:https://pkg.go.dev/std
- 经典书籍:《Go程序设计语言》《Go语言实战》
- 开源项目:Docker, Kubernetes, Etcd等Go项目源码
下篇介绍了Go最强大的并发特性和实际项目开发中的关键技能。Go通过goroutine和channel提供了独特的并发编程模型,相比其他语言的线程/异步方案更加简单高效。建议通过实际项目练习来巩固这些概念,逐步掌握Go语言的精髓。
相关推荐
- 手机突然无法识别u盘(手机突然无法识别u盘怎么办呢)
-
1、手机不支持OTG功能,所以将U盘连接到手机后,手机无法识别U盘的内容,因此显示不了;这种情况只能换台支持OTG功能的手机来连接U盘才行。2、手机支持OTG功能,但是使用的OTG线质量有问题导致无...
- windows10更新不了一直重试(window10一直更新失败)
-
可能是以下几个原因导致的:1.可能是硬盘剩余空间太少或者碎片太多,队伍用文件进行清理并清理碎片即可。2.可能是windows10版本不支持软件进行运行。3.没有权限,打开相应的权限后重启即可情况说明你...
-
- 联想笔记本怎么进入安全模式
-
联想笔记本电脑进入安全模式的方法如下:1、第一步,按下【windows+R】,打开【运行】,输入【msconfig】后,点击【确定】。2、第二步,打开【系统配置】窗口后,点击【引导】。3、第三步,勾选【安全引导】后,选择需要的安全模式,通常...
-
2025-11-10 08:05 liuian
- winxp升级包下载(xp 升级)
-
题主你好,XP系统要升级成WIN7很简单,方法如下:1,下载win7系统iso镜像到本地硬盘,右键使用WinRAR等工具解压出来2,将最大的win7.gho文件和Onekeyghost工具放到同一目...
- windows 7电脑配置要求(windows7电脑配置要求)
-
官方推荐最低配置:处理器:1GHz32位或者64位处理器内存:1GB及以上显卡:支持DirectX9128M及以上(开启AERO效果)硬盘空间:32位16G以上(主分区,NTFS格式)...
- ie主页被360锁定不能修改(ie浏览器首页被锁定360导航怎么取消百度知道)
-
法一、点击开始,运行,键入msconfig点击“确定”,在弹出的窗口中切换到“启动”选项卡,禁用可疑程序启动项。法二、1、打开360安全卫士进入“更多”;2、主页防护;3、在打开的对话框中进行设...
- 镜像文件是干嘛的(镜像文件有什么用)
-
所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特...
- office免安装版(office免安装版什么意思)
-
1先打开安装程序输入安装序列号KEY,进行安装,在弹出来的界面里我们选择自定义安装;2在【文件位置】选项中选择好文件位置,一般大点的软件我们选择C盘以外的位置安装,可以直接点浏览选择,也可以直接将现有...
- 笔记本可以外接显卡吗(笔记本电脑核显和独显的区别)
-
目前市面上有许多笔记本电脑支持外接显卡,这些笔记本通常具备Thunderbolt3或USB-C接口,这些接口可以通过外接显卡扩展图形性能。例如,戴尔XPS系列、华硕ROG系列、雷蛇Blade系列等都...
- 深度启动盘(深度启动盘安装系统教程)
-
要制作深度系统的启动盘,需要首先下载深度系统的镜像文件,然后选择一个合适的软件进行制作。推荐使用Rufus或Etcher等工具,将镜像文件写入U盘或光盘中,并设置好启动顺序。接着将制作好的启动盘插入电...
- 免费看电影的网站是什么(免费的看电影网站有哪些)
-
优选优酷,不过现在的乐视好的,片源十分高清,如果网速一般就选优酷,播放流畅,片源最多。我个人比较喜欢看电影电视,所以市面上有的播放器都有在用,有一定的经验。如果是下播放器的话,一般网速人又懒就选PP...
- 有wifi电脑却上不了网(有wifi但是电脑连不上网是什么原因经常性的)
-
有几个可能的原因导致电脑无法通过WiFi上网。首先,可能是WiFi信号不稳定或弱,可以尝试靠近路由器或重启路由器来改善信号。其次,可能是电脑的网络设置有问题,可以检查IP地址、DNS设置等是否正确。另...
- 快用苹果助手官方网站(快用苹果助手官方网址)
-
PP助手、爱思助手、当乐助手、海马苹果助手、91苹果助手、同步推手机助手、快用苹果助手、等等都是不错的第三方助手!第三方应用助手是一款智能手机的PC端管理客户端。将应用助手安装到您的PC上,然后可以选...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
