我的第一个 Golang 程序
我是 Go 语言的新手。上周我完成了《Go 之旅》,今晚我编写了我的第一个程序,一个交互式的康威生命游戏。我使用了Ebiten,它自称是一个非常简单的 Go 2D 游戏库。考虑到它目前的开发阶段,它的文档和示例非常出色。它也是跨平台的🎮。
我的大部分专业经验都与 JavaScript 和 Python 等动态语言有关。当我开始学习一门语言时,我喜欢先看完官方教程,然后开始着手开发游戏。这让我回归本源。我最初接触编程是为了制作独立游戏,但后来发现自己更热爱为 Web 编写高性能代码(无论前端还是后端!)。
让屏幕上的事物动起来、舞起来、消逝起来,这本身就是一种享受。这也是学习 Web 开发如此有趣的原因之一。不过,网络上没有任何东西会消亡(现在还有 0.03% 的 Web 用户在使用 IE 5/6/7!)。
我学习 Go 的理由
我喜欢 Go 的单一二进制部署方式。它与 Node/Python 完全相反,让我更容易与朋友分享一些小东西。我团队里的人都对 Go 非常感兴趣。和他们谈论这门语言很有趣,而且我知道如果我继续学习,他们会对我的经验感兴趣。随着其他人学习 Go,我们将来也有机会开发一些 Go 微服务。
我学习 Go 的原因很简单,因为我喜欢构建高性能的 Web 应用程序(这当然让我兴奋),但主要原因之一是它很新奇,令人兴奋。网上对这门语言的讨论和 Rust 社区很相似。我喜欢学习,也喜欢在灵感迸发时寻找灵感。Go 的文档也很完善,支持也很到位(例如 StackOverflow 讨论帖),而且我附近似乎经常会举办会议和聚会。
康威生命游戏
康威生命游戏是一个细胞自动机,但这对大多数人来说意义不大。想象一下,一个细胞网格有两种状态:活着或死亡。你看到的“动画”实际上是连续几代细胞被渲染到屏幕上。有四条规则可以帮助决定下一代细胞的状态。维基百科对此进行了如下描述。
- 任何活细胞如果邻近的活细胞少于两个,就会死亡,就像由于细胞数量不足一样。
- 任何有两个或三个活邻居的活细胞都会存活到下一代。
- 任何拥有三个以上活邻居的活细胞都会死亡,就像由于人口过剩一样。
- 任何死细胞只要有三个活细胞邻居,就会变成活细胞,就像通过繁殖一样。
需要有一个初始状态。正如我们从规则中看到的,空棋盘不会产生单元格
rand
Go 语言的包会在每次运行程序时生成一个确定的值序列。我不希望我的开发板每次加载时默认状态都一样,所以我用一个不断变化的变量来填充它:时间。
下面的函数接收一个指向我的Game
结构体的指针,该结构体有一个名为 board 的属性。我们编辑存储在内存中的棋盘,因此不需要返回任何内容。
// Given an empty board, give it a random state
func giveState(g *Game) {
rand.Seed(time.Now().UnixNano()) // <-- Different every time
for x := 0; x < RES; x++ {
for y := 0; y < RES; y++ {
if rand.Intn(15) == 1 {
g.board[x][y] = 1
}
}
}
}
每个细胞在第一代中存活的概率是1/15。Ebiten的更新函数以每秒60帧的速度运行,我每次更新都会创建一个新的一代。我在左上角打印出当前的代数。
康威生命游戏似乎是计算机科学专业学生的必经之路。至少,这是我从网上学到的。我的课堂上没有讲到它,所以玩玩它,看看人们用它创作的精彩作品,感觉很有趣。比如,一个时间步长均匀的数字时钟复制品。
相互作用
如果你点击棋盘,附近的单元格状态就会翻转。你可以在屏幕上拖动,使单元格层叠。动画图案本身就充满乐趣。Ebiten 有一个点击函数,我会在每个更新周期调用它。这里我们使用多个内联赋值语句来设置x
和 的值y
。这些变量的类型是在编译时推断出来的。
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
x, y := ebiten.CursorPosition()
interaction(x, y, g)
}
尽管 Golang 级别较低,但它似乎默认不会妨碍你。
Go 模块
据我所知,Go 的模块系统是最近才新增的。我通过运行创建了一个 mod 文件go mod init github.com/my/repo
,然后每当我构建或运行代码时,依赖项都会自动更新。更改开发设置非常简单,只需克隆代码库并运行即可go install
。
我还发现 VS Code 的 Go 插件非常实用,它能执行的操作可能比我想象的还要多!这帮助我专注于学习这门语言。对于任何想学习 Go 语言的人,我推荐Go 之旅。至于其他资源,谁知道呢——我自己正在测试一些,欢迎推荐!
查看我的 GitHub 上的代码。
与 150 多名订阅我的关于编程和个人成长的新闻通讯的人一起!
我发布有关科技的推文@healeycodes。
文章来源:https://dev.to/healeycodes/my-first-golang-program-14nc