上一讲我们介绍了一个包的管理,本讲我们就来看看Go如何跑起来一个WebServer的Hello World。首先我们创建一个新的文件夹go_test2,然后把之前第四讲中go_test的内容都复制到这个文件夹中。
然后打开main.go,在文件中然后输入代码如下:
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
router.Run(":9999")
}
我突然感觉这个太眼熟了,默默的想起了用Nodejs的Express框架写一个Hello World程序。
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
是不是感觉太像太像了, 那让我们讨论下他们在代码层面的差异点和差异原因。
第一个:Express或者常规的Nodejs程序中是没有Go中的package main这行代码的,这是因为Go需要用package main来声明这是一个Go的入口程序,如果你的项目文件夹中只有func main()函数,没有package main编译就会报错,因为Go编译器在检索过程中,不知道把哪个函数当做入口函数。
第二个:引入包的语句Nodejs使用require,使用既可以加载第三方依赖包,比如直接输入var express = require('express');Nodejs解释器会到node-module中去查找express插件,也可以通过路径的方式,比如/aaa/bbb/ccc.js。去查找项目跟路径下的自定义插件。但是在Go中加载第三方包,会直接到包的下载地址去加载,也就是我们第五讲介绍的。GOPATH去加载,在系统中的路径为下图:
第三个:其实就是就是Go赋值与Nodejs的不同
在Go中,:=是表示声明, =表示赋值。
Go 中的变量声明方式为 var name type = expression,type 和 expression,通常可以省略一个或者不省略,原因是Go为强类型语言。变量在声明的时候已经确定了类型。另外Go变量在没有声明的情况下是没有办法使用的。var name type = expression 简写方式为 name:= expression。如果没指定type,数据类型根据expression的返回值设定。
另外此处要介绍一下Go值机制也是一个非常好的特性,零值机制,在Go中不存在未初始化的变量。
在我们仅仅指定了类型type,没有指定变量的值或者表达式expression的情况下,或自动给变量进行赋值。
int类型赋值为0
布尔值赋值为false
字符串赋值为""
接口和引用类型赋值为nil
对于数组或者结构体这种符合数据存储结构中,赋值为所有内部元素的『零』值
可不要小看零值机制,它大大简化了我们对于变量的判断逻辑,并且不需要额外工作就能感知边界条件的行为。
回到最开始我们执行了写入main.go的Hello world代码之后,执行go build,就能看到下图中的内容,Go编译器去下载我们使用得依赖库了。
在gotest2下生成了gin_test,这个是最新的Hellow World执行文件,执行之后就能看到下图。
在浏览器的地址栏输入localhost:9999,就能看到Go语言使用gin编写的Hello World了。(注意:绿色的200是我访问了一次localhost:9999才出现的访问记录)
至此第六讲结束,下一讲我们就来介绍一下如果在页面上展示一些变量数据。