共计 3515 个字符,预计需要花费 9 分钟才能阅读完成。
xdm 上次有分享到 GO web 开发 中 http 包中 的简略办法应用,最初还有一个 模板,在这里补充一下
间接上案例
模板
- 咱们在 main.go 外面写一个 服务端的 demo,应用模板来将冬天的数据写入到 html 文件中
- 对应的须要写一个 html 文件,并设置好 须要模板注入的数据地位
main.go
package main
import (
"fmt"
"html/template"
"net/http"
)
var myTemp *template.Template
type 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 main import ( "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)
}
}
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 阿兵云原生,欢送点赞关注珍藏,下次见~