第一个应用:main.go、g.Server() 启动与端口配置
引言
上一章我们用 gf init 生成了工程,但为了讲清原理,本章先手写一个最小应用:一个 main.go、一个 g.Server(),把它跑起来并配置监听端口。
概念
g.Server() 是 g 包提供的门面方法,用于获取默认 Web 服务对象(类型为 *ghttp.Server)。服务对象负责路由注册与 HTTP 监听,最终通过 s.Run() 启动。监听地址与端口有两种配置方式:
- 代码方式:
s.SetAddr(":8000")或s.SetPort(8000)。 - 配置文件方式:工程根目录(或 manifest/config 下)的
config.yaml中配置server.address。
两种方式同时存在时,以官方文档"配置优先级"说明为准。端口配置属于服务配置项,官方文档 goframe.org 的服务端章节有完整字段说明。
代码示例
先写不依赖配置文件的最小版本:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server() // 获取默认服务对象
// 注册路由:访问 / 时返回欢迎文本
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.Write("Hello GoFrame v2!")
})
s.SetPort(8000) // 等价写法:s.SetAddr(":8000")
s.Run() // 阻塞启动,监听 :8000
}
保存为 main.go,执行 go mod tidy 拉取依赖后运行:
go run main.go
# 浏览器访问 http://127.0.0.1:8000/ 即可看到响应
更贴近工程化的做法是把端口放进配置文件。在同目录创建 config.yaml:
server:
address: ":8000"
代码改为:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/hello", func(r *ghttp.Request) {
// 接口场景常直接返回 JSON
r.Response.WriteJson(g.Map{
"message": "hello",
})
})
s.Run() // 地址从配置 server.address 读取
}
注意点
s.Run()是阻塞调用,一般放在main末尾;程序收到退出信号时框架会做优雅退出处理。- 路由处理函数入参是
*ghttp.Request(下文简称r),响应对象为r.Response。 - 有配置文件时请把
config.yaml放在运行目录下;使用gf run时框架会从工程 manifest/config 自动加载(详见第 05 章)。 - 端口被占用、配置未生效时,先检查配置文件位置与
server.address写法。
小结
g.Server() + BindHandler + s.Run() 就是 GoFrame v2 Web 服务的最小闭环。本章的路由是"函数注册"的雏形,后续章节会展开路由分组、中间件与规范路由。服务端更多配置项以官方文档 goframe.org 为准。