liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

GO语言Echo框架学习 #229

Open liujiusheng opened 2 years ago

liujiusheng commented 2 years ago

对比发现Echo框架比gin框架更易于使用,于是开始学习Echo框架。

奇怪的是所有GO的Web框架都说自己是最快最好的,让人完全摸不着头脑。

如果框架作为命令行使用就需要检查该框架调用exe文件是否方便,

如果要作为Web框架使用,那就要检验做数据库的增删改查是否方便。

Web框架

连接PG数据库有pg和bun两个大的orm大框架,bun前身是go-pg框架,功能很丰富,但看了很久也没看明白怎么开始使用,最后只能放弃,选用了pg这个库。

使用数据库还需要引入go内置的包"database/sql"

通常连接数据库的操作放到代码的init函数内,初始化完成后赋值给一个全局变量,全局变量要是sql.DB类型的指针值。

slice切片和array的区别就是slice长度不定,array的长度在初始化时就定死了。

数据库查询出来的结果是一个数组,需要使用rows.Next()迭代取值。

结构体如果要通过encoding/json转换为json或xml的话需要标识每个字段的名称,否则转换出来会是空值:{{}{}}

echo框架内的context.JSON()函数中也使用到了encoding/json包的json.Marshal函数。

CLI工具

使用exec.Command()函数来包命令,命令的参数全部分切分成很多个参数传入本函数。

声明好后需要用command.Run()函数才会执行。

可以使用e.Static("/static", "static")来声明打包哪些静态资源,包括exe文件、html文件等。

如果想接收输出或错误信息需要提前声明command.Stdout = &bytes.Buffer{}和command.Stderr = &bytes.Buffer{}

代码如下:

package main

import (
    "net/http"
    // "os/exec"
    "fmt"
    // "bytes"
    // "encoding/json"
    "github.com/labstack/echo/v4"
    "database/sql"
    _ "github.com/lib/pq"
    // "github.com/uptrace/bun"
    // "github.com/uptrace/bun/dialect/pgdialect"
    // "github.com/uptrace/bun/driver/pgdriver"
    // "github.com/labstack/echo/v4/middleware"
)

var dbcon *sql.DB
type Users struct {
    Name string `json:"name" xml:"name"`
    Des string `json:"des" xml:"des"`
}

// 访问路径:http://localhost:1323/static/wasm_exec.html
func init(){
    db, err := sql.Open("postgres", "host=172.16.0.246 port=5433 user=postgres password=Dlyg@123 dbname=test sslmode=disable")
    dbcon = db
    if err!=nil{
        fmt.Println(err)
    }
}

func main() {
    //首先生成cmd结构体,该结构体包含了很多信息,如执行命令的参数,命令的标准输入输出等
    // command := exec.Command("F:\\3dtile-tool\\3dtile.exe", "-f", "shape","-i", "F:\\yuzhongqu.shp", "-o", "F:\\test-3dtile", "--height", "OBJECTID")
    // //给标准输入以及标准错误初始化一个buffer,每条命令的输出位置可能是不一样的,
    // //比如有的命令会将输出放到stdout,有的放到stderr
    // command.Stdout = &bytes.Buffer{}
    // command.Stderr = &bytes.Buffer{}
    //执行命令,直到命令结束
    // err := command.Run()
    // if err != nil{
    //   //打印程序中的错误以及命令行标准错误中的输出
    //   fmt.Println(err)
    //   fmt.Println(command.Stderr.(*bytes.Buffer).String())
    //   return
    // }
    // //打印命令行的标准输出
    // fmt.Println(command.Stdout.(*bytes.Buffer).String())

    e := echo.New()
    e.Static("/static", "static")
    e.GET("/", func(c echo.Context) error {
        rows, err := dbcon.Query("SELECT * FROM users")
        if err!=nil{
            fmt.Println(err)
        }
        var userlist []Users
        for rows.Next() {
            var (
                name string
                des string
            )
            rows.Scan(&name,&des);
            var a Users
            a.Name = name;
            a.Des = des;
            fmt.Println(a)
            userlist = append(userlist, a)
        }
        fmt.Println(userlist)
        return c.JSON(http.StatusOK, userlist)
    })
    e.Logger.Fatal(e.Start(":1323"))
}