go语言基础知识学习第四天
解决下载速度较慢问题
一个全球代理为 Go 模块而生的:https://goproxy.io/zh/
在终端中输入
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
在项目目录下新建go.mod
文件
go mod init 名称
导入包操作
beego 框架
是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架
基于八大独立的模块构建的,是一个高度解耦的框架
典型的 MVC 架构,它的执行逻辑为
bee 工具
为了协助快速开发 beego 项目而创建的项目
通过 bee 可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署
go get github.com/beego/bee
新建一个 Web 项目
bee new myproject
监控 beego 的项目运行
bee run
在go.mod中安装bee工具问题
解决方法为 export GO111MODULE=off && go get -u github.com/beego/bee
简单的Beego项目
学习资料
https://www.flysnow.org/2017/01/05/install-golang.html
在线生成文档
godoc -http=:8000
Gin 框架安装
go get -u github.com/gin-gonic/gin
会出现报错问题
github.com/mattn/go-isatty/isatty_tcgets.go:6:8: cannot find package "golang.org/x/sys/unix" in any of:
/home/solomon/sdk/go1.14.3/src/golang.org/x/sys/unix (from $GOROOT)
/home/solomon/go/src/golang.org/x/sys/unix (from $GOPATH)
github.com/golang/protobuf/proto/buffer.go:11:2: cannot find package "google.golang.org/protobuf/encoding/prototext" in any of:
/home/solomon/sdk/go1.14.3/src/google.golang.org/protobuf/encoding/prototext (from $GOROOT)
/home/solomon/go/src/google.golang.org/protobuf/encoding/prototext (from $GOPATH)
github.com/golang/protobuf/proto/buffer.go:12:2: cannot find package
解决方法
git clone https://github.com/gin-gonic/gin.git
- 在
/go/src/golang.org/x
目录下安装git clone https://github.com/golang/sys.git
- 在
/go/src/google.golang.org/protobuf
目录下安装git clone https://github.com/protocolbuffers/protobuf-go.git
go install github.com/gin-gonic/gin
运行简单的示例
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
r.Run()
}
Gin项目简单示例
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
type user struct {
ID int
Name string
Age int
}
func main() {
//users := []User{{ID:123, Name:"Solomon"}, {ID:456, Name: "Django"}}
r := gin.Default()
// 自动重定向
r.RedirectTrailingSlash = false
v1Group := r.Group("/v1", func(c *gin.Context) {
// 路由中间件
fmt.Println("/v1的中间件")
})
{
// * 匹配后面所有的
v1Group.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
//c.JSON(200, users)
})
v1Group.GET("/post", func(c *gin.Context) {
// 获取查询参数 Query
// 可以通过DefaultQuery方法指定一个默认值
c.String(200, c.DefaultQuery("search", "hello world"))
})
v1Group.GET("/blog", func(c *gin.Context) {
c.JSON(200, c.QueryArray("blog"))
})
v1Group.POST("/blog", func(c *gin.Context) {
data := c.PostForm("data")
c.String(200, data)
})
v1Group.GET("/json", func(c *gin.Context) {
// 实现服务端对JSONP的支持非常简单
c.JSONP(200, gin.H{
"message": "Hello World",
})
//c.JSON(200, user{ID: 123, Name: "Solomon", Age: 16})
// 传递JSON数组
//allUsers := []user{{ID: 124, Name: "Solomon", Age: 16}, {ID: 125, Name: "Solomon", Age: 16}}
//c.IndentedJSON(200, allUsers)
// 对特殊的字符串不进行转义
//c.PureJSON(200, gin.H{
// "message": "<b>Hello World!</b>",
//})
})
}
v2Group := r.Group("/v2")
{
// * 匹配后面所有的
v2Group.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(200, "The user id is %s", id)
//c.JSON(200, users)
})
v2Group.GET("/post", func(c *gin.Context) {
// 获取查询参数 Query
// 可以通过DefaultQuery方法指定一个默认值
c.String(200, c.DefaultQuery("search", "hello world"))
})
v2Group.GET("/blog", func(c *gin.Context) {
c.JSON(200, c.QueryArray("blog"))
})
v2Group.POST("/blog", func(c *gin.Context) {
data := c.PostForm("data")
c.String(200, data)
})
}
r.Run(":8080")
}
日志使用
func main() {
// Disable Console Color, you don't need console color when writing the logs to file.
gin.DisableConsoleColor()
// Logging to a file.
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
// Use the following code if you need to write the logs to file and console at the same time.
// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}
func main() {
router := gin.New()
// LoggerWithFormatter middleware will write the logs to gin.DefaultWriter
// By default gin.DefaultWriter = os.Stdout
router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
// your custom format
return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
param.ClientIP,
param.TimeStamp.Format(time.RFC1123),
param.Method,
param.Path,
param.Request.Proto,
param.StatusCode,
param.Latency,
param.Request.UserAgent(),
param.ErrorMessage,
)
}))
router.Use(gin.Recovery())
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}
简单的项目