介绍

  Go 语言最近十分火热,但对于新手来说,想立马上手全新的语法和各种各样的框架还是有点难度的。即使是基础学习也很有挺有挑战性。

  在这篇文章中,我想用最少的代码写出一个可用的 API 服务。这个 API 可以提供增删改查(CRUD)这些基本功能,对象关系映射 (ORM) 让数据库操作变得非常简单,不用 100 行代码,都可以搞定。让我们开始吧。

  在下面这个连接中可以找到最后完成的全部代码:

  https://github.com/cgrant/gin-gorm-api-example

起步

  这篇文章假设读者已经安装了 Go 的运行环境,如果您还没装好 Go,可以移步到这篇文章,参考一下:

  http://cgrant.io/tutorials/go/getting-started-with-go/

Gin

  既然是搭建 API 服务,就需要一个 Web 框架来处理路由并响应 HTTP 请求,Go 语言有很多各式各样的开源框架,本文我们选用了 Gin https://github.com/gin-gonic/gin。Gin 的特点是响应速度快,结构简单。

  我们先来给 API 服务创建文件夹和 main.go 文件吧。

  1. $ mkdir -p $GOPATH/src/simple-api
  2. $ cd $GOPATH/src/simple-api
  3. $ touch main.go

  代码如下

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Hello World")
  5. }

  我们先测试一下。

  1. $ go run main.go
  2. Hello World

  非常好,现在让我们把 Gin 框架的代码加进去。

  1. package main
  2. import "github.com/gin-gonic/gin"
  3. func main() {
  4. r := gin.Default()
  5. r.GET("/", func(c *gin.Context) {
  6. c.String(200, "Hello World")
  7. })
  8. r.Run()
  9. }

  保存并运行。

  1. $ go run main.go
  2. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
  3. using env: export GIN_MODE=release
  4. using code: gin.SetMode(gin.ReleaseMode)
  5. [GIN-debug] GET / main.main.func1 (3 handlers)
  6. [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
  7. [GIN-debug] Listening and serving HTTP on :8080
  8. [GIN] 2016/12/0214:57:52 | 200 | 33.798µs | ::1 | GET /

在浏览器中访问地址 http://localhost:8080

  1. Hello World

  成功了!!!

  不过我们是在写 API,没人会返回字符串的,把返回值改成 JSON 格式吧。

  1. package main
  2. import "github.com/gin-gonic/gin"
  3. func main() {
  4. r := gin.Default()
  5. r.GET("/", func(c *gin.Context) {
  6. c.String(200, "Hello World")
  7. c.JSON(200, gin.H{
  8. "message": "Hello World",
  9. })
  10. })
  11. r.Run()
  12. }

  保存文件,重新运行 API server,刷新浏览器,返回值变成了 JSON。

  {“message”: “Hello World”}

用 GORM 把数据持久化

  现在让我们考虑一下服务的持久化层,在这部分中,我们将把数据保存在一个本地 SQLite 文件中,在稍后的章节中,我们将改为 MySQL。

  Gorm http://jinzhu.me/gorm/ 是一个 Go 语言实现的对象关系映射 (ORM) 框架。它简化了程序对数据库的操作,虽然我不是很赞同在大型的复杂系统中使用 ORM,但 ORM 在小项目中做做原型验证还是很不错的。Gorm 是 Go 的生态中很流行的工具,所以我们先从这里入手吧。

  我们从头开始,先把之前的代码去掉,在浏览了 GORM 的主要功能后,再把 Gin 的代码加回来。先来个简单的例子:

  1. package main
  2. import (
  3. "github.com/jinzhu/gorm"
  4. _ "github.com/jinzhu/gorm/dialects/sqlite"
  5. )
  6. func main() {
  7. db, _ := gorm.Open("sqlite3", "./gorm.db")
  8. defer db.Close()
  9. }

  执行程序后,在运行环境的文件系统里可以看到一个新文件 gorm.db。这就是 API 的数据库文件了。我们的 API 程序现在还没什么功能,让我们再加点代码吧。

  1. package main
  2. import (
  3. "github.com/jinzhu/gorm"
  4. _ "github.com/jinzhu/gorm/dialects/sqlite"
  5. )
  6. type Person struct {
  7. ID uint `json:"id"`
  8. FirstName string `json:"firstname"`
  9. LastName string `json:"lastname"`
  10. }
  11. func main() {
  12. db, _ := gorm.Open("sqlite3", "./gorm.db")
  13. defer db.Close()
  14. p1 := Person{FirstName: "John", LastName: "Doe"}
  15. p2 := Person{FirstName: "Jane", LastName: "Smith"}
  16. fmt.Println(p1.FirstName)
  17. fmt.Println(p2.LastName)
  18. }

  我们刚刚加了一个叫 Person 的结构体,然后建了几个 Person 类型的实例,并打印了里面的值。请注意结构体 Person 里的每个域的名字必须是大写字母开头的,这样 Go 语言才认为这是一个共有域。

  1. package main
  2. import (
  3. "github.com/jinzhu/gorm"
  4. _ "github.com/jinzhu/gorm/dialects/sqlite"
  5. )
  6. type Person struct {
  7. ID uint `json:"id"`
  8. FirstName string `json:"firstname"`
  9. LastName string `json:"lastname"`
  10. }
  11. func main() {
  12. db, _ := gorm.Open("sqlite3", "./gorm.db")
  13. defer db.Close()
  14. db.AutoMigrate(&Person{})
  15. p1 := Person{FirstName: "John", LastName: "Doe"}
  16. p2 := Person{FirstName: "Jane", LastName: "Smith"}
  17. db.Create(&p1)
  18. var p3 Person
  19. db.First(&p3)
  20. fmt.Println(p1.FirstName)
  21. fmt.Println(p2.LastName)
  22. fmt.Println(p3.LastName)
  23. }

  到目前为止都很顺利,执行一下程序看看能得到什么结果。

  1. $ go run main.go
  2. John
  3. Smith
  4. Doe

  写起来还是挺简单的吧,不用几行代码,我们就可以从数据库中存取信息了。Gorm 还有很多其他特性,接下来让我们再试试其中比较重要的功能,当然,要了解更多信息的话,请查看 Gorm 的文档。

作者:blackpiglet
链接:https://www.jianshu.com/p/35665b584347
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)的更多相关文章

  1. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

    修改数据结构   基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机.只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改.   我要做的是在 Person ...

  2. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (二)

    创建 API   我们之前已经跑过 Gin 框架的代码,现在是时候加些功能进去了. 读取全部信息   我们先从"增删改查"中的"查"入手,查询我们之前添加的信息.我接下来要删除几行代码,并把 Gin ...

  3. 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务

    来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...

  4. 使用 SpringBoot+Dubbo 搭建一个简单分布式服务

    实战之前,先来看几个重要的概念 开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo.RPC.分布式.由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服务,所以 ...

  5. 用nodejs搭建一个简单的服务器

    使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...

  6. 初学Node(六)搭建一个简单的服务器

    搭建一个简单的服务器 通过下面的代码可以搭建一个简单的服务器: var http = require("http"); http.createServer(function(req ...

  7. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  8. 使用gitblit搭建一个简单的局域网服务器

    使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...

  9. Golang学习-第二篇 搭建一个简单的Go Web服务器

    序言 由于本人一直从事Web服务器端的程序开发,所以在学习Golang也想从Web这里开始学起,如果对Golang还不太清楚怎么搭建环境的朋友们可以参考我的上一篇文章 Golang的简单介绍及Wind ...

随机推荐

  1. virtualbox之紧虚拟主机与本地主机连接

    也就是手工配置IP地址.子网掩码.网关和DNS. 设置方法如下: vi /etc/sysconfig/network-scripts/ifcfg-eth0 编辑本地网卡的配置文件 主要查看下面这几项是 ...

  2. [程序员代码面试指南]字符串问题-回文最少分割数(DP)

    问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数. 例:str="ACDCDCDAD",输出2. 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示 ...

  3. 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...

  4. redis.conf讲解

    转自https://www.cnblogs.com/zhang-ke/p/5981108.html #redis.conf # Redis configuration file example. # ...

  5. hystrix熔断器之HystrixRequestLog

    HystrixRequestLog会记录所有执行过的命令.

  6. C# NX二次开发环境搭建

    在网上看到一篇C#二次开发环境搭建的文章:NX二次开发-使用NXOPEN C#手工搭建开发环境配置 ,写得非常好.我按照文章操作,过程中遇到几个问题,把问题分享给大家,希望对各位有帮助. 注意三点: ...

  7. 我给VSCode报了个bug,微软工程师竟然凌晨回复了...

    柠檬哥整理了50本计算机相关的电子书,关注公众号「后端技术学堂」,回复「1024」即可获取,回复「进群」拉你进读者技术交流群. 本文首发个人微信公众号,欢迎围观点击阅读原文 最近遇到一个有意思的bug ...

  8. Android小部件Widget开发过程中的坑和总结

    @ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...

  9. (数据科学学习手札96)在geopandas中叠加在线地图

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...

  10. 01 百度 AI Studio 基础操作记录(一) Notebook

    转载参考: AI Studio基本操作(一) Notebook篇 一.基础 1.新建文件: 可以使用命令, !cat <<newfile > newfile.py 在项目空间内直接创 ...