xdm 上次有分享到GO web 开发 中 http 包中的简略办法应用,最初还有一个 模板 , 在这里补充一下

间接上案例

模板

  • 咱们在 main.go 外面写一个 服务端的 demo,应用模板来将冬天的数据写入到 html 文件中
  • 对应的须要写一个 html 文件,并设置好 须要模板注入的数据地位

main.go

package mainimport (    "fmt"    "html/template"    "net/http")var myTemp *template.Templatetype Person struct {    Name  string    Title string    Age   int}//开始解决数据和做响应func userInfo(w http.ResponseWriter, req *http.Request) {    defer req.Body.Close()    var pp []Person    // 简略模仿数据    p1 := Person{        Name:  "xmt 1号",        Title: "1 号 展示台",        Age:   18,    }    p2 := Person{        Name:  "xmt 2号",        Title: "2 号 展示台",        Age:   15,    }    p3 := Person{        Name:  "xmt 3号",        Title: "3 号 展示台",        Age:   29,    }    pp = append(pp, p1, p2, p3)    // 将数据写到模板中    err := myTemp.Execute(w, pp)    if err != nil {        fmt.Println("Execute err ;%v", err)        return    }}func main() {    //初始化模板    var err error    myTemp, err = template.ParseFiles("./index.html")    if err != nil {        fmt.Println("ParseFiles err ;%v", err)        return    }    //注册解决模板的函数  并 开启监听    http.HandleFunc("/", userInfo)    err = http.ListenAndServe("0.0.0.0:9999", nil)    if err != nil {        fmt.Println("ListenAndServe err ;%v", err)        return    }}

index.html

<html>    <head>    </head>    <body>        <p>hello world</p>        <table border="1" align="center" width="600px">            <tr>                <td>{{.Name}}</td> <td>{{.Age}}</td><td>{{.Title}}</td>            </tr>        </table>    </body></html>

上述代码也比较简单,间接运行 main.go 就能够启动服务端,咱们只须要在浏览器中拜访

http://localhost:8888/

即可看到咱们 html 展现的成果,数据是动静的

另外,接下来一起来看看 go web 中应用的 mysql 数据库

Mysql

连贯数据库

操作数据库,根本是如下几个步骤

  • 先 open,再 ping , 必须要 ping 通了之后才能够算是连贯上了MySQL数据库
  • 写 mysql 的代码,必须引入这个包 _ "github.com/go-sql-driver/mysql" , 须要先执行 mysql 中的 init 函数
  • 此处记得填写对本人 mysql 的明码,如果感觉明码不好记,能够设置明码为 123456 ,用于学习和实际

    package mainimport (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql" // 正文掉后异样 _ 调用初始化函数)func main() {    //关上mysql 数据库 进行连贯 , 必须要 ping 通 才算是连贯上 mysql 数据库    db, err := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/go_test?charset=utf8mb4")    if err != nil {        fmt.Println("Open err : ", err)        return    }    err = db.Ping()    if err != nil {        fmt.Println("Ping err : ", err)        return    }    db.Close()}

此处咱们能够看到 charset=utf8mb4 ,这里是设置字符编码格局为 utf8mb4 ,次要是用于

这里须要说一下,基本上咱们当初的 mysql 编码设置都是设置成 utf8mb4字符集 ,因为它反对 4 个字节的 Unicode 字符

在晚期 Unicode 还不够欠缺的时候,是应用的 UTF8 ,只须要最长 3 个字节就能够示意 Unicode 字符

减少

做数据减少操作,向数据库中插入数据

  • 此处咱们应用 占位符的形式来插入数据
  • sqlInfo 变量外面填写 规范的 sql 语句即可
func insertPiceInfo(db *sql.DB) {    // ? 作为占位符号    sqlInfo := "insert into user(name,age)values(?,?)"    ret, err := db.Exec(sqlInfo, "xxx", 19)    if err != nil {        fmt.Println("Exec err : ", err)        return    }    //插入数据的id    id, err := ret.LastInsertId()    if err != nil {        fmt.Println("LastInsertId err : ", err)        return    }    fmt.Println("LastInsertId == ", id)    //本次操作影响的行数    rows, err := ret.RowsAffected()    if err != nil {        fmt.Println("RowsAffected err : ", err)        return    }    fmt.Println("rows == ", rows)}

执行插入语句后,能够通过插入的后果,来获取插入数据胜利的 id 和本次插入数据影响的行数

删除

删除数据就比较简单,同样的咱们能够拿到删除数据的后果,来获取对应影响的行数等等

func deletePiceInfo(db *sql.DB) {    // ? 作为占位符号    sqlInfo := "delete from user where id=  xx "    ret, err := db.Exec(sqlInfo)    if err != nil {        fmt.Println("Exec err : ", err)        return    }    //本次操作影响的行数    rows, err := ret.RowsAffected()    if err != nil {        fmt.Println("RowsAffected err : ", err)        return    }    fmt.Println("rows == ", rows)}

批改

func updatePiceInfo(db *sql.DB) {    // ? 作为占位符号    sqlInfo := "update user set name='xxx' where id=xx"    ret, err := db.Exec(sqlInfo)    if err != nil {        fmt.Println("Exec err : ", err)        return    }    //本次操作影响的行数    rows, err := ret.RowsAffected()    if err != nil {        fmt.Println("RowsAffected err : ", err)        return    }    fmt.Println("rows == ", rows)}

看,批改操作和其余减少,删除操作相似,写法基本上差不多,还比较简单

查问

查问操作的话,应该是数据库操作外面用的绝对更多的操作了 , go 操作 mysql 查问的话,简略的 有 2 个留神点:

  • Query 之后的 失去的 rows 须要记得 close
  • 调用查问数据之后,须要记得马上调用 Scan 办法否则持有的数据库链接不会被开释
type myInfo struct{    id int    name string    age int}func selectInfo(db *sql.DB) {    sqlInfo := "select * from user"    rows, err := db.Query(sqlInfo)    if err != nil {        fmt.Println("Exec err : ", err)        return    }    // 十分重要:敞开 rows 开释持有的数据库链接    defer rows.Close()    //输入查问进去的行数    for rows.Next(){        var u myInfo        rows.Scan(&u.id,&u.name,&u.age)        fmt.Printf("id = %d, name = %s, age = %d\n",u.id,u.name,u.age)    }}

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是阿兵云原生,欢送点赞关注珍藏,下次见~