GoWeb总结
GoWeb 不会自己去找目录中的 html 文件,需要设置一个处理器处理静态资源(把css,js,html的文件夹注册),这样通过 goweb 服务器访问到页面。
目录示例:

注册写法:
//设置处理静态资源,如css和js文件http.Handle("/static/",http.StripPrefix("/static/",http.FileServer(http.Dir("shucheng/views/static/"))))//直接去html页面http.Handle("/pages/",http.StripPrefix("/pages/",http.FileServer(http.Dir("shucheng/views/pages/"))))
调用的方法:
func StripPrefix
func StripPrefix(prefix string, h Handler) Handler
StripPrefix 返回一个处理器,该处理器会将请求的 URL.Path 字段中给定前缀 prefix去 除后再交由h 处理。StripPrefix 会向 URL.Path 字段中没有给定前缀的请求回复 404 page not found。
func FileServer
func FileServer(root FileSystem) Handler
FileServer 返回一个使用 FileSystem 接口 root 提供文件访问服务的 HTTP 处理器。要使用操作系统的 FileSystem 接口实现,可使用 http.Dir :
http.Handle("/", http.FileServer(http.Dir("/tmp")))
解析模板文件:
//解析模板文件t:=template.Must(template.ParseFiles("./shucheng/views/pages/manager/book_manager.html"))//执行t.Execute(w,books)
template.Must 方法会把里面包的解析模板函数的错误打包成一个 panic
Must 方法:
func Mustfunc Must(t *Template, err error) *Template
Must 函数用于包装返回 (*Template, error) 的函数/方法调用,它会在 err 非 nil 时 panic ,一般用于变量初始化:
var t = template.Must(template.New("name").Parse("html"))
func ParseFiles
func ParseFiles(filenames ...string) (*Template, error)
ParseFiles 函数创建一个模板并解析 filenames 指定的文件里的模板定义。返回的模板的名字是第一个文件的文件名(不含扩展名),内容为解析后的第一个文件的内容。至少要提供一个文件。如果发生错误,会停止解析并返回 nil 。
处理器方法名字可以随便写,但是必须传入(w http.ResponseWriter,r *http.Request) 两个参数
获取前端传过来的值:
Get 方法
可以通过 r.FormValue("bookId") 快速获取 get 请求中 from 表单中传过来的参数此方法还可以从url?aa=1 中获取到里面的参数
Post方法
通过 title:=r.PostFormValue("title") 快速获取前端表单中传过来的参数
Mysq l初始化数据库:
import(
"database/sql"
_ "github.com/go-sql-driver/mysql"
)//创建两个全局变量var(
Db *sql.DB
err error
)//初始化数据库
func init(){
Db,err=sql.Open("mysql","root:1234@tcp(localhost:3306)/bookstore")
if err!=nil{
panic(err.Error())}
}
mysql 导包必须手打,需要记住
_ "github.com/go-sql-driver/mysql"
全局变量 Db *sql.DB 是一个指针类型,别把 * 漏掉
连接数据库的驱动需要记住:
Db,err = sql.Open("mysql","root:1234@tcp(localhost:3306)/bookstore")
此方法不会验证数据源是否正确,如果需要验证数据源则需要使用Ping方法验证。
err := db.Ping()
查询语句分为两种 : Query() 与 QueryRow() 方法, Query方法用于查询多条语句,QueryRow()方法用于查询单条语句。
Query()方法示例:
//GetBooks获取数据库中所有图书,返回一个切片类型与错误func GetBooks()([]*model.Book,error){//sql语句sqlStr:="select id,title,author,price,sales,stock,img_path from books"//执行rows,err:=utils.Db.Query(sqlStr)//如果出错返回nil,errif err!=nil{return nil,err}//定义一个BOOK类型的切片var books[] *model.Book//遍历for rows.Next(){book:=&model.Book{}//给book中的字段赋值err:=rows.Scan(&book.ID,&book.Title,&book.Author,&book.Price,&book.Sales,&book.Stock,&book.ImgPath)if err!=nil{return nil,err}//将book添加到books中append(books,book)将book追加到books后面books=append(books,book)}returnbooks,nil}
Query() 方法查询出的多条数据一般会存在一个相对结构体类型的切片里面,使用 rows.Next 方法遍历(此方法会返回一个 bool 值,如果下一行报错或者没有则会返回 false),使用
books = append(books,book) 把数据库中查出来的字段存入 books 切片。因为存入的是结构体类型的切片,多以使用时可以直接在循环里通过 结构体.属性名 调用。
Db.QueryRow() 方法
代码示例如下:
//写sql语句sqlStr:="select id,username,password,email from users where username=? and password=?"//执行row:=utils.Db.QueryRow(sqlStr,username,password)user:=&model.User{}err:=row.Scan(&user.ID,&user.Username,&user.Password,&user.Email)
记住不管是 Query() 方法 还是 QueryRow() 方法row.Scan() 方法必须传入地址值(传入地址值Scan 方法会为 user 结构体赋数据库中查出的值),Scan 方法会把传入的变量赋上数据库中查询出来字段对应的值。
增删改操作都使用 Db.Exec() 方法
更新字段示例:
//sql语句
sqlStr:="update books set title=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?"result,err:=utils.Db.Exec(sqlStr,b.Title,b.Author,b.Price,b.Sales,b.Stock,b.ImgPath,b.ID)
插入字段:
sqlStr2:="insertintouser(name,age)values(?,?)"fmt.Print("请输入你的名字跟年龄“:")//从键盘获取值fmt.Scanln(&na,&ag)ret,err:=db.Exec(sqlStr2,na,ag)if err!=nil{fmt.Printf("新增信息失败:err:%v\n",err)return}//ret.LastInsertId()返回新增的列的id,并不是所有的数据库都支持这个方法theID,err:=ret.LastInsertId()//新插入数据的idif err!=nil{fmt.Printf("ret.LastInsertId,err:%v\n",err)return}fmt.Printf("信息新增成功,你的id是:%d\n",theID)
此方法只可以查询部分自增主键的数据库新插入的id:ret.LastInsertId() //新插入数据的id
删除数据:
//删除数据func deleteRowDemo(){sqlStr4:="delete from user where id=?"//args删掉第几行ret,err:=db.Exec(sqlStr4,3)if err!=nil{fmt.Printf("db.Exec,err:%v\n",err)return}//操作影响行数n,err:=ret.RowsAffected()if err!=nil{fmt.Printf("ret.RowsAffected,err:%v\n",err)return}fmt.Printf("删除成功,影响行数:%d\n",n)}
注意:插入删除更新字段不需要传入地址值,传入值就行了
测试(测试类必须用 _test 方式结尾,方法以test开头,必须传入(t*testing.T) 参数):
func TestUser(t *testing.T){t.Run("验证用户名或者密码:",testLogin)}func testLogin(t*testing.T){user,err:=CheckUserNameAndPassword("admin","123456")If err!=nil{fmt.Println("错误是:",err)}fmt.Println("获取用户信息是:",user)}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
