用Go语言造一个教您学做365道菜视频的播放器,这事儿挺上头
- 旅游
- 2026-08-03 23:58:33
- 85
先说句实话,我一开始也没想到,用Go写个视频播放器,能跟“学做菜”扯上关系,但你看啊,咱每天打开短视频App,刷到那种“教您学做365道菜视频”的合集,是不是总忍不住点进去看两眼?尤其是晚上十一点,饿着肚子刷到红烧肉,那感觉……啧。
但我今天不聊做菜,我想聊的是怎么用Go语言,把一个“教您学做365道菜视频”的播放列表,给整得明明白白,不是让你去写个抖音,而是说,咱自己动手,做个简单的、能播视频、能切菜谱、能记笔记的小工具,这事儿用Go干,特别顺手。
为什么是Go,不是Python或者Java?
你可能觉得,Python写脚本快,Java写后端稳,Go凭啥插一脚?我跟你讲,Go的好处是“又稳又快又简单”,你看,处理视频文件这种事儿,动不动就是几百MB的大文件,Go的并发模型处理流式读取,那叫一个顺滑,Go编译出来就是个单独的二进制文件,你发给朋友,他不用装环境,双击就能跑——就像你把一盘做好的菜端到人家桌上,不用他再自己洗菜切菜。
咱们这个“教您学做365道菜视频”播放器,核心就三件事:
- 读视频文件(本地路径,或者网上扒下来的链接)
- 按菜谱顺序排列表(比如今天学第1道“西红柿炒蛋”,明天学第2道“麻婆豆腐”)
- 播放的时候还能记笔记(盐放少了”“火别太大”)
用Go写,这三件事都挺直白。
第一步:先把视频目录给“收拾”了
假设你的电脑里有一个文件夹,叫 365道菜视频,里面按顺序放着:
001_西红柿炒蛋.mp4
002_麻婆豆腐.mp4
003_红烧肉.mp4
...
365_佛跳墙.mp4
那我们在Go里,第一步就是遍历这个文件夹,把文件按序号排好,代码写起来跟炒菜似的,先热锅,再倒油:
package main
import (
"fmt"
"os"
"path/filepath"
"sort"
"strings"
)
func main() {
dir := "./365道菜视频"
files, err := os.ReadDir(dir)
if err != nil {
fmt.Println("读目录失败:", err)
return
}
var videoList []string
for _, f := range files {
if strings.HasSuffix(f.Name(), ".mp4") {
videoList = append(videoList, f.Name())
}
}
// 按文件名排序(因为文件名的前缀是001,002...)
sort.Strings(videoList)
fmt.Printf("一共找到 %d 个视频\n", len(videoList))
for i, v := range videoList {
fmt.Printf("%d. %s\n", i+1, v)
}
}
你看,这个输出结果,就像个菜单一样,清清楚楚。这步的关键就是用 os.ReadDir + sort.Strings,简单粗暴,你要是用Python,还得考虑编码,Go就是干脆。
第二步:做个“菜谱播放列表”结构体
现在咱有了视频列表,但光有文件名还不够,咱得知道每道菜的具体信息,
- 菜名(就是文件名去掉序号和扩展名)
- 需要什么食材(这个可以手动录入)
- 烹饪时间(比如3分钟?那不可能,是视频时长)
- 备注(你自己的学做心得)
这时候就轮到Go的结构体(struct)上场了,就像做菜用的调料盒,每个格子放不同的料:
type Dish struct {
Order int // 序号,比如1
Name string // 菜名,quot;西红柿炒蛋"
FilePath string // 视频文件路径
Notes string // 你写的笔记
Duration string // 视频时长,quot;05:32"
}
我们把刚才遍历出来的文件,塞进这个结构体:
var dishes []Dish
for i, f := range videoList {
name := strings.TrimSuffix(f, ".mp4")
// 去掉前面的"001_"这种前缀
parts := strings.SplitN(name, "_", 2)
if len(parts) == 2 {
dishes = append(dishes, Dish{
Order: i + 1,
Name: parts[1],
FilePath: filepath.Join(dir, f),
})
}
}
到这一步,你的“365道菜”就从一个散乱的文件夹,变成了一串有序的、可操作的数据,这感觉就像你把一堆土豆、茄子、辣椒洗干净切好码在案板上,就等开火了。
第三步:简单播放功能(调用系统播放器)
Go本身不负责解码视频,但咱可以调用系统默认播放器,用 exec.Command 就行,像这样:
import "os/exec"
func playVideo(path string) error {
cmd := exec.Command("open", path) // macOS
// cmd := exec.Command("cmd", "/c", "start", path) // Windows
// cmd := exec.Command("xdg-open", path) // Linux
return cmd.Start()
}
你只要在终端跑这个程序,然后输入一个数字,5,程序就帮你打开第5道菜的视频,说句实在话,这个功能有点“糙”,但管用,就像你炒菜时用铲子而不是用硅胶勺,不讲究但顺手。
第四步:记笔记——用Go写文件
学做菜最怕什么?怕的是“眼睛学会了,手没学会”,所以咱得记笔记,在视频播放的时候,你暂停一下,在终端里输入一句“盐放多了”,程序给你存下来。
代码就这么简单:
func saveNote(dish *Dish, note string) {
dish.Notes = note
// 可以存到一个notes.txt文件里,或者存到JSON
data, _ := json.MarshalIndent(dish, "", " ")
os.WriteFile("notes/"+fmt.Sprintf("%03d", dish.Order)+".json", data, 0644)
}
这样,你学完365道菜,就有365个JSON笔记文件。以后想复盘哪道菜,直接打开对应的JSON,比翻纸质菜谱方便多了,这招在Go里特别自然,因为标准库自带 encoding/json,啥都不用装。
第五步:加个“今日推荐”功能——用随机数
有时候你不知道今天该学哪道菜,这就得靠随机,Go的 math/rand 用起来跟抽奖似的:
import "math/rand"
func recommendDish(dishes []Dish) Dish {
idx := rand.Intn(len(dishes))
return dishes[idx]
}
你运行程序,它跟你说:“今天建议学第42道菜:鱼香肉丝。”挺有意思的,有种“天人合一”的感觉,而且这玩意儿还能治选择困难症——别想“先学哪道”,直接让程序帮你决定,省了纠结的时间。
第六步:如果视频在B站或YouTube怎么办?
这个咱得诚实说,Go的标准库没有直接扒视频的功能,但你可以配合 yt-dlp 这个开源工具(不是广告,是真管用),先下载下来,再放进你的 365道菜视频 文件夹,或者你就用我已经写好的这个遍历逻辑,因为 yt-dlp 下载下来的文件名自带序号,正好能对上。
你甚至可以在Go里调用 yt-dlp,用 exec.Command 就行,虽然这有点“套娃”,但解决问题嘛,别嫌工具多。
进阶:给程序加个“网页控制界面”
你要是觉得终端黑乎乎的不好看,可以加一个简单的HTTP服务,Go写这个简直是本命——标准库 net/http 就够了,做一个简单的页面,显示菜名列表,点一下就从后端启动播放器。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 输出HTML,列出所有菜名
// 每个菜名是个超链接,点击就调用 /play?id=5
})
http.HandleFunc("/play", func(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
// 找到对应的dish,调用playVideo
})
这下你就能在手机浏览器上,连着电脑的局域网IP,躺在床上选菜、播放、记笔记。这才叫“生活气息”——做饭都懒得站起来换电脑。
一点小提醒:别贪多,一天一道菜
我写这个程序的时候,自己也试了试,头两天挺新鲜,学了西红柿炒蛋和麻婆豆腐,到第三天就断了——不是程序不行,是懒,所以后来我加了个功能:记录每天的连续学习天数,用个简单的 lastStudyDate 存到本地文件里,一旦断了一天就清零,这招挺狠,逼着你自己跟自己较劲。
说点跟做菜有关的题外话
学做365道菜,其实跟写代码一样,核心不是“多”,而是“会变通”,你今天用Go写了个播放器,明天就能改成“教您学做365道汤”的进度管理器,程序是死的,人是活的,菜谱上的调料量,永远是“适量”——就像Go的 error 处理,你总得自己判断到底要不要 panic。
不知不觉写了这么多,用Go做菜谱视频管理,其实最大的好处不是功能多强,而是你亲手写出来的那套逻辑,就像自己家厨房的布局——酱油放哪、锅铲挂哪,全凭手感,程序也一样,你写的 split、sort、json.Marshal,每一步都是自己的节奏。
接下来你就打开终端,敲个 go run main.go,然后挑一道菜,动手试试吧,说不定今天学的这道,就是你自己最好吃的一顿。
