百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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");

关键区别:

  1. goroutine比线程更轻量(初始仅2KB栈)
  2. Go运行时自动调度goroutine到OS线程
  3. 语法简单,只需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())

关键区别:

  1. channel是Go内置的线程安全通信机制
  2. 可以带缓冲(make(chan int, 100))
  3. 支持关闭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];
    }
}

关键区别:

  1. select可以同时监控多个channel
  2. 常用于超时控制:
   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);

关键区别:

  1. Go需要定义结构体对应JSON结构
  2. 字段标签控制JSON属性名
  3. 编解码可能返回错误需要处理

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

进一步学习资源

  1. 官方文档:https://golang.org/doc/
  2. 标准库参考:https://pkg.go.dev/std
  3. 经典书籍:《Go程序设计语言》《Go语言实战》
  4. 开源项目: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上,然后可以选...