手把手教你写第一个 Golang 接口
2020/2/1 17:29:30
本文主要是介绍手把手教你写第一个 Golang 接口,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
User 登录接口
文件目录结构
- src - user - TbUserController.go --------------- user 模块控制器 - TbUserService.go ----------------- user 逻辑层 - TbUserDao.go -------------------- user 数据操作层 - TbUser.go ----------------------- user 数据模型层 - main.go --------------------------------- 入口文件
main.go 入口文件
http.Server 是 golang 自带 http 服务类,http.Server{ Addr: ":8899" }
表示监听来自 localhost:8899 端口请求;s.ListenAndServe()
表示持续监听
import ( "net/http" "user" ) func main() { s := http.Server{ Addr: ":8899" } // 调用所有user模块 handle user.UserHandle() s.ListenAndServe() }
TbUserController - user 模块控制器
程序从 main.go 进入 user.UserHandle()
方法,我们从方法内部定义好路由 /login
与 LoginController()
方法绑定。使得请求 http://localhost:8899/login
调起 LoginController()
执行
import ( "encoding/json" "net/http" ) // 所有 user 模块 handle func UserHandle() { http.HandleFunc( "/login", LoginController ) } // 登陆控制器 func LoginController( w http.ResponseWriter, r *http.Request ) { username := r.FormValue( "un" ) // 接收参数 pwd := r.FormValue( "pwd" ) er := LoginService( username, pwd ) // 登陆逻辑 b, _ := json.Marshal( er ) // 结构转对象 w.Header().Set( "Content-Type", "application/json;charset=utf-8" ) w.Write( b ) }
TbUserService.go - 登陆逻辑
将请求传递的 un
用户名 & pwd
密码,传入数据操作层进行数据库查询是否存在该用户,密码是否一致后。判断返回结果给页面
import "commons" // 登陆逻辑 func LoginService( un, pwd string ) ( er commons.EgoResult ) { u := SelBuUnPedDao( un, pwd ) // 数据操作层 if u != nil { er.Status = 200 }else{ er.Status = 400 } return er }
TbUserDao.go - 数据操作层
用 un
用户名 & pwd
密码 查询数据库
import ( "commons" "fmt" ) // 更加用户名,密码查询 func SelBuUnPedDao( un, pwd string ) *TbUser { sql := "select * from tb_user where username=? and password=? or email=? and password=? or phone=? and password=?" rows, err := commons.Dql( sql, un, pwd, un, pwd, un, pwd ) if err != nil { fmt.Println( err ) return nil } if rows.Next() { // 因为这里只有一个,多个需要for user := new( TbUser ) // TbUser 结构充当数传输类 rows.Scan( &user.Id, &user.Username, &user.Password, &user.Phone, &user.Email, &user.Created, &user.Updated ) commons.CloseConn() return user } return nil }
TbUser.go - 数据传输类
package user type TbUser struct { Id int64 Username string Password string Phone string Email string Created string Updated string }
DBUtils.go - 数据库工具类
package commons import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) var ( db *sql.DB stmt *sql.Stmt rows *sql.Rows ) func openConn() ( err error ) { db, err = sql.Open( "mysql", "root@tcp(localhost:3306)/packagist" ) if err != nil { fmt.Println( "数据库链接错误,", err ) return } return nil } func CloseConn() ( err error ) { if rows != nil { rows.Close() } if stmt != nil { stmt.Close() } if db != nil { db.Close() } return } // sql, 不定参数 func Dml( sql string, args ... interface{}) ( int64, error ) { err := openConn() if err != nil { fmt.Println( "执行 DML 出现错误" ) return 0, err } stmt, err = db.Prepare( sql ) if err != nil { fmt.Println( "预处理 DML 出现错误" ) return 0, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 ret, err := stmt.Exec( args ... ) if err != nil { fmt.Println( "执行 DML 出现错误" ) return 0, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 count, err := ret.RowsAffected() if err != nil { fmt.Println( "获取影响行数出现错误" ) return 0, err } CloseConn() return count, err } func Dql( sql string, args ... interface{}) ( *sql.Rows, error ) { err := openConn() if err != nil { fmt.Println( "执行 DML 出现错误" ) return nil, err } stmt, err = db.Prepare( sql ) if err != nil { fmt.Println( "预处理 DML 出现错误" ) return nil, err } // 此处需要 ... 表示切片,如果没有表示数组,会报错 rows, err := stmt.Query( args ... ) if err != nil { fmt.Println( "执行 DML 出现错误" ) return nil, err } // 此处没关闭, 调用时需要注意关闭 return rows, nil }
EgoResult.go - 结果返回类
package commons type EgoResult struct { Status int }
这篇关于手把手教你写第一个 Golang 接口的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23MongoDB身份认证机制揭秘!
- 2024-11-20MongoDB教程:从入门到实践详解
- 2024-11-17执行 Google Ads API 查询后返回的是空数组什么原因?-icode9专业技术文章分享
- 2024-11-17google广告数据不同经理账户下的凭证可以获取对方的api数据吗?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用