介绍

  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 文件吧。

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

  代码如下

package main

import "fmt"

func main() {
fmt.Println("Hello World")
}

  我们先测试一下。

$ go run main.go
Hello World

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

package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
})
r.Run()
}

  保存并运行。

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

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

Hello World

  成功了!!!

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

package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello World")
c.JSON(200, gin.H{
"message": "Hello World",
})
})
r.Run()
}

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

  {“message”: “Hello World”}

用 GORM 把数据持久化

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

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

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

package main

import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
) func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close()
}

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

package main

import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
) type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
} func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close() p1 := Person{FirstName: "John", LastName: "Doe"}
p2 := Person{FirstName: "Jane", LastName: "Smith"} fmt.Println(p1.FirstName)
fmt.Println(p2.LastName)
}

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

package main

import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
) type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
} func main() {
db, _ := gorm.Open("sqlite3", "./gorm.db")
defer db.Close() db.AutoMigrate(&Person{}) p1 := Person{FirstName: "John", LastName: "Doe"}
p2 := Person{FirstName: "Jane", LastName: "Smith"} db.Create(&p1)
var p3 Person
db.First(&p3) fmt.Println(p1.FirstName)
fmt.Println(p2.LastName)
fmt.Println(p3.LastName)
}

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

$ go run main.go
John
Smith
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. [HCTF 2018]admin wp

    首先打开页面,查看源码 you are not admin考虑是否为需要登录 后发现右上方有个登录 考虑密码爆破,用户名为admin,密码未知 摔进burpsuite后爆破 后得到密码为123 登录得 ...

  2. vue父子组件状态同步的最佳方式续章(v-model篇)

    大家好!我是木瓜太香!一名前端工程师,之前写过一篇<vue父子组件状态同步的最佳方式>,这篇文章描述了大多数情况下的父子组件同步的最佳方式,也是被开源中国官方推荐了,在这里表示感谢! 这次 ...

  3. JS 浏览器BOM

    BOM:Browser Object Model 浏览器对象模型 2.组成: window :窗口对象 1.创建: 2.方法: *与弹出框有关 1.alert(); 弹出警告框 2.confirm() ...

  4. MATLAB 与 Excel 接口

    MATLAB 与 Excel 接口MATLAB 与 Excel 有两种接口方式:一种是通过 MATLAB 提供的 Excel 生成器,生成220 MATLAB 实用教程DLL 组件和 VBA 代码,实 ...

  5. hystrix源码小贴士之Yammer Publisher

    HystrixYammerMetricsPublisher 继承HystrixMetricsPublisher,创建HystrixYammerMetricsPublisherCommand.Hystr ...

  6. 关于bat脚本中的命令状态码相关的%errorlevel%变量

    bat脚本中常用%errorlevel%表达上一条命令的返回值,即命令执行状态码.也称命令退出码 一般上一条命令的执行结果返回的值只有两种,0和非0 (如常见的1,2,4,5,9009等等),0一般会 ...

  7. powershell编程实例-001-生成指定大小的null/zero文件或随机文件

    NULL文件,也有的称为zero文件,即全是二进制/十六进制的0文件 在powershell 中可以按如下方法生成指定大小的zero文件: 只需要修改大小即可,格式如3MB,或者2GB $tempFi ...

  8. lombok使用(给自己看的,只为不要忘记自己用过的技术)

    如何使用? 一.1)eclipse使用方法 1. 从项目首页下载lombok.jar 2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境) 2)idea使用方 ...

  9. JavaScript,你好!

    初识JavaScript 概述 JavaScript是一门世界上最流行的脚本语言 ECMAScript它可以理解为是javaScript的一个标准 而且现在最新的版本已经到es6版本 但是大部分浏览器 ...

  10. Python练习题 020:累积累加

    [Python练习题 020] 求1+2!+3!+...+20!的和 -------------------------------------------------- 据说这题是"累积累 ...