介绍
我只使用几周后就将Golang用于我的大型学校项目,这是多么容易,而且我遇到的问题。
客户和应用程序
在我的数字技术课程中,我需要为我的最终项目申请,价值30%的成绩。我吸引了自然选择模拟,我喜欢创建它们,并且在五月的过去有很多失败的模拟,所以我问我的生物学老师是否想要一个是出于教育目的,他们同意了。 我知道几种语言,Python,JavaScript,C#。我从学校学到了这些语言,所以我班上的每个人都知道这些Langauges。
在这一点上,我知道我正在做什么,我正在做的是谁,而不是我要做的。 /p>
选择golang
C#将是第一个明显的选择,大多数班级都使用它,因为我们最近使用了它,但是我决定不这样做。
Python本来是一个不错的选择,我以前曾经用这种语言编写神经网络,但这太容易了。
甚至JavaScript都很好,使用JavaScript可以轻松地将我的代码分发给我们学校笔记本电脑上的学生,这些笔记本电脑上散布着阻塞所有内容的学校软件(恶意软件)。
我没有选择这些,我选择了我只有2周左右才开始学习的语言。我听说过Golang的简单性,表现和所有其他赞美,因此通过将我的成绩置于界限的情况下,对其进行测试似乎是一个好主意。
它是如何开始的
在项目的第一阶段(在我的残酷设计和模型之后),我快速停止了,学生将如何使用我的程序?
您会看到,在我的学校,您不能运行可执行文件,需要特殊许可,否则必须由学校分发。
我可以通过学校分发我的代码,但是要让每个生物学学生安装可执行文件(大多数人甚至不知道这意味着什么)可能是一个很大的要求。
我的另一个选择是抛弃Golang并选择JavaScript。每个人都有浏览器,因此每个人都应该能够使用它。但是,我知道JavaScript的内存和速度问题与该项目不太匹配,它不太可能工作。
我认为我的最后一个选择是将Golang编译为WebAssembly(WASM)。这很好,但是我一直遇到绩效问题,这对于一个可以高频打电话给WASM的程序是无法接受的。
作为一个开玩笑的想法,我还向客户建议我可以在Golang制作服务器,然后从JavaScript客户端与该服务器进行通信,该服务器将在学生的笔记本电脑上。
我选择了最后一个选项。
设置服务器
我从来没有用任何其他语言都与这样的浏览器进行过通信,所以这是一个疯狂的想法。我花了一段时间,但是使用“废除您的原型”的理念,我做了一个墓地,直到我可以写信给自己的服务器为止。我还在JavaScript中制作了一个前端,以测试服务器上的请求。最终,我编写了一台可以通过主页发送(HTML,CSS,JS)的服务器,并且可以通过“ GET”请求来登记功能。
这是我的main
函数。
func main() {
r := mux.NewRouter()
r.HandleFunc("/sim/{id}", takeRequest).Methods("GET")
r.HandleFunc("/start/{id}", startSimulation).Methods("GET")
r.HandleFunc("/remove/{id}", removeSimulation).Methods("GET")
r.PathPrefix("/").Handler(http.FileServer(http.Dir("../Frontend")))
http.Handle("/", r)
http.ListenAndServe(":9090", nil)
}
这就是我所需要的,设置非常简单。
学习如何使机器学习
下一步是将其连接到一堆具有可以相互作用的神经网络的动物。老实说,这并不难。
根据我的经验编写类似的模拟,我能够粉碎样板,编写结构(我以前从未使用过结构,只是课,这很重要)到节点之间的链接。我最终遇到了我的第一个问题,这让我意识到了为什么Python用于机器学习,即使它臭名昭著的循环缓慢。
在神经网络中,输入连接到隐藏节点,隐藏节点连接到几层的隐藏节点,然后将最后一层连接到输出。这是一个问题,因为隐藏节点连接到两个隐藏节点,和 outputs,这是一个动态键入语言无关紧要的问题。我无法将输出和隐藏节点放在同一变量中。作为一个快速修复,我刚刚进行了2个变量并填充了其中一个,如果节点来自最后一层,则我填充了另一层。不为此感到骄傲,但绝对需要回到某个时候。
这是隐藏的节点结构:
type Node struct {
num float32
linksN []Node
linksO []Output
fired bool
infs int
weights []float32
lastLayer bool
}
num
是节点从上面层中的节点获取的数据之和。
linksN
和linksO
是我解决静态打字问题的可怕解决方案。
fired
只是关于num
是否大于0的检查
infs
是在此节点中添加了多少个节点
weights
是与linksN
和linksO
的平行切片,是一个修改器值,可以传递到其他节点。
lastLayer
只是这个节点是否在最后一层,也是我可怕的解决方案的一部分。
它没有更新!
现在,我已经进入了我的项目很远了,使用Golang的情况很棒,当然,它与我曾经曾经的许多语言有所不同,但是写作非常好。我正处于模拟周围的绵羊时,代码很简单,为绵羊的坐标增添了价值。所以我在一个功能中做到了这一点,而且...没有动。我检查了它的坐标是否在功能中发生变化(Cource的打印调试),这是我的困惑正在增加。我检查了该值是否在函数调用之前和之后都在更改,并且它是不是。现在,我从来没有碰过一生中的指针,我听说过它们,知道它们很危险,然后回到我的小python世界中,但是一旦我遇到这个问题,我就知道问题是因为问题是因为参考。解决这个问题几乎没有努力,只需将绵羊的切片(清单)变成绵羊的一小部分,然后奏效!现在我的绵羊可以在屏幕上移动!
type State struct {
allGrass []*Grass
allWolves []*Wolf
allSheep []*Sheep
}
都是所有指针, works 。
“我想节省我的进度” - 客户
因此,我知道如何将数据保存到Golang的文件,但是如果他们的计算机忙于运行模拟,我该如何允许老师保存模拟?简单,go
。
解决方案很简单,我只是将一个永远的循环放在一个可以聆听一系列命令的函数中,包括退出,加载和保存,当我呼叫该函数时,我只需要在它之前编写go
即可。这是一个非常好的功能,仅使我的项目达到了一个全新的水平。
go runCommand()
这是您需要查看的所有代码,如此简单。
事后
golang是一种令人难以置信的语言,现在可能是我最喜欢的语言。我不仅能够第一次创建服务器,而且还实现神经网络,这一事实是用服务器端命令同时使用的,我几乎不知道的语言都是惊人的