学习之始
环境安装
在 studygolang.com/dl 下载对应二进制,下一步下一步安装。
配置加速
原因访问外网, go 拉去依赖模块会很慢
Mac、 Linux 配置
以阿里云代理为例
vim .bash_profile
export GO111MODULE="on"
export GOPROXY="https://mirrors.aliyun.com/goproxy/"
// 重新生效
source .bash_profile
Win 配置
$env:GO111MODULE="on"
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/"
校验环境
终端输入 go env
hellogo.go
package main
import "fmt"
func main() {
fmt.Println("Hello Golang ...")
}
- package main 包名称
- import xxx 导入报名
- func xxx 运行主函数
- fmt.函数名称 调用 fmt 包函数,打印
"Hello Golang ..."
实践中学习
使用 Gin 提供一个可以访问的服务
Golang 有很多web服务框架,可以选择 Beego Iris
初始化项目 mooose-go
- moose-go
-- main.go
根据 gin 文档创建 gin 对象提供服务
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
initApp()
}
func initApp() {
gin.SetMode("debug")
app := gin.Default()
app.Run("0.0.0.0:8090")
}
-
创建 main.go ,初始化 gin,可以设置一些 gin 参数
-
主入口文件必须包含一个
main
函数 -
app := xxx ,:= 用来定义变量
-
运行 go run main.go 服务会跑在
8090
端口上
创建访问路由
这个访问路由其实就是调用的 api 地址 ---> url
创建 router - > router.go 管理路由
package router
import (
"github.com/gin-gonic/gin"
)
func InitRouter(app *gin.Engine) {
}
挂载到 gin 上
修改 main.go
import (
"fmt"
// 导入 router
"moose-go/router"
"github.com/gin-gonic/gin"
)
....
app := gin.Default()
// 添加上这一行
router.InitRouter(app)
app.Run("0.0.0.0:8090")
...
- 使用 router,传递 gin 对象,方便操作使用 gin
创建访问 url --> Controller
controller 目录 -> v1 目录 --> user_controller.go
package v1
import (
"moose-go/common"
"github.com/gin-gonic/gin"
)
type UserController struct {
}
func (uc *UserController) RegisterRouter(engine *gin.Engine) {
group := engine.Group("/api/v1/user")
group.GET("/list", uc.List)
}
func (uc *UserController) List(c *gin.Context) {
}
- 结构体 UserController 对应表示一类,用来区分管理;类似 java 中的 class 创建对象
uc *UserController
*XXX 表示一个指针对象- 函数 RegisterRouter 用来创建路哟欧规则,挂载到 gin 引擎上
- group := engine.Group("/api/v1/user") 表示一组,
- 在后面写 group.GET("/list", uc.List) 就可以访问全路径 /api/v1/user/list
uc.List 为实际处理业务逻辑函数,接收类型
HandlerFunc`c *gin.Context
gin 上下文参数,可以获取访问请求到这个路径 url 一些参数
使用 UserController
router --> InitRouter 中添加为
func InitRouter(app *gin.Engine) {
new(v1.UserController).RegisterRouter(app)
}
- new 关键字,标示创建出 UserController 对象,把 UserController 挂在到 gin 引擎中
模拟返回用户信息列表
定义结构体 UserInfo
model 目录 UserInfo.go
package model
type UserInfo struct {
UserId int64 `json:"userId"`
UserName string `json:"userName"`
Phone string `json:"phone"`
Avatar string `json:"avatar"`
}
-
type XXX struct {} 表示定义一个 XXX 结构体,可以用来封装数据
-
int64,string Go语言数据类型
-
bool、init、init8、int16、init32、init64、string、byte ...等用到了其他再说吧
-
json:"userName"
tag中的第一个参数是用来指定别名,用于 JSON 解码和编码
完善 List 中逻辑
func (uc *UserController) List(c *gin.Context) {
userList := make([]model.UserInfo, 0)
for i := 0; i < 2; i++ {
user := model.UserInfo{UserName: "测试用户", Phone: "1537898764", Avatar: "https://gitee.com/shizidada/moose-resource/raw/master/emoji/custom/over.jpeg"}
userList = append(userList, user)
}
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"data": userList,
"message": "获取用户列表",
})
c.Abort()
}
make
make 和 new 都是内存的分配(堆上)
make 只用于 slice、map 以及 channel 的初始化(非零值);
new 用于类型的内存分配,并且内存置为零。
make 返回的是引用类型本身;new返回的是指向类型的指针
for 循环
在 go 中定义 for 循环 for i := 0; i < 2; i++ {}
user := model.UserInfo{} 结构体实例化 UserInfo 对象
append 用来给slice(切片)追加一个元素
-
每次需要扩容的时候,容量并不是简单增长到足够容纳新的元素,而是会被进一步扩充成2n,原来的两倍
gin 返回JSON数据
// c gin.Context
// gin.H 为一个 map 类型
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"data": userList,
"message": "获取用户列表",
})
c.Abort()
- http.StatusOK 返回请求状态码
- gin.H 包装返回数据
- c.Abort() 终止后面所有的该请求下的函数,返回结果