Go 标注库 net/http 中封装了丰富的 http 服务相关的方法,只需要使用标准库就可以方便的构建 http 服务。
Hello world 示例
package main
import (
"net/http"
"fmt"
)
type Handler struct {
}
func (h *Handler)ServeHTTP(rep http.ResponseWriter, req *http.Request) {
rep.Write([]byte("Hello world"))
}
func main() {
http.Handle("/", &Handler{})
http.ListenAndServe(":8081", nil)
}
使用 net/http 包,我们只需要实现一个 Server 接口的 struct 即可,Server 接口只有一个 函数 ServeHTTP(ResponseWriter, Request)。
监听Handler*有两种形式,一种是像上面那样,还有一种如下
func main() {
http.ListenAndServe(":8081", &Handler{})
}
两种都可以,net/http 包实现基于一个 Server 结构体,第二种方式直接把 Handler 设置为 Server 实例的字段 handler,而第一种使用了 net/http 包提供的默认 Handler 的实现 ServeMux, 如果 Server 实例 handler 为空那么就使用默认的 Handler。ServeMux 是一个实现了多路由的 Handler 接口的 struct,我们可以通过它添加多个路由。
func main() {
http.Handle("/api", &Handler1{})
http.Handle("/web", &Handler2{})
http.ListenAndServe(":8081", nil)
}
http 客户端访问测试代码
package main
import (
"net/http"
"fmt"
"io/ioutil"
)
func main() {
resp, err := http.Get("http://127.0.0.1:8081")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
responseBody,err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(responseBody))
}
实现一个 Handler 接口还是需要些不少代码的,net/http 提供了另外一个函数 HandlerFunc。
package main
import (
"net/http"
"fmt"
)
func main() {
http.HandleFunc("/", func(rep http.ResponseWriter, req *http.Request) {
fmt.Println(req.RequestURI)
rep.Write([]byte("Hello world"))
})
http.ListenAndServe(":8081", nil)
}
net/http 实现了一个 type HandlerFunc func(ResponseWriter, Request) 类型,并给该类型添加了func (f HandlerFunc) ServeHTTP(w ResponseWriter, r Request)方法。net/http 把我们传入的函数转化为 HandlerFunc 类型,并把其绑定到 ServeMux 的默认实例上。
NotFountHandler
http.ListenAndServe(":8081", http.NotFoundHandler())
RedirectHandler
http.ListenAndServe(":8081", http.RedirectHandler("/test", 302))
FileServer
http.ListenAndServe(":8081", http.FileServer(http.Dir("./")))非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
gorm 简介 gorm 是 go 语言中实现的比较好的 ORM 包,且是国人开发的。项目地址 事故描述 Scan 是 gorm 提供的一个把数据库结果读取到 struct 的函数。定义如下: // Scan scan value to a struct func (s *DB) Scan(dest interface{}) *DB { return s.NewScope(s.Value).Set("gorm:query_destination", dest).callCallbacks(s.parent.callbacks.queries).db } 今天同事小张写代码的时候写了一个
三个工具介绍 go fmt是用来规范go文件格式,比如格式化单个文件 go fmt xxx.go goimports 用来检查导入包,导入依赖包,删除不依赖的包 gometalinter 集成go语言几乎所有检测工具,静态分析代码,包含功能如下 go vet -工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。 go tool vet --shadow -用来检查作用域里面设置的局部变量名和全局变量名设置一样导致全局变量设置无效的问题 gotype -类型检测用来检测传递过来的变量和预期变量类型一致 gotype -x
Go 语言的可移植性 Java 平台可移植性是众所都知的,Java 的可移植性依赖于其虚拟机 JVM,Java 实现了对不同平台的 JVM 的支持,那么一份 Java 代码就可以在各个平台上运行。而 Go 语言的可移植性也是依赖于其 runtime,runtime 去对接操作系统层,用户代码在 runtime 中运行,用户代码就不用去关心平台问题。 查看 Go 支持的OS和平台: > $ go version go version go1.11 darwin/amd64 liushuai@liushuaideMacBook-Pro ~/Documents/goProject/src
临时忽略掉struct中空字段 type User struct { Email string `json:"email"` Password string `json:"password"` } 当我们把用户信息返回给前端的时候显然需要忽略调Password 字段,则可以这样做: json.Marshal(struct{ *User Password bool `json:"password,omitempty"` }{ User:user, }) 临时添加额外字段 type User struct { Email string `json:"
golang中字符串格式化输出 package main import ( "fmt" "os" ) type point struct { x, y int } func main() { // Go提供了几种打印格式,用来格式化一般的Go值,例如 // 下面的%v打印了一个point结构体的对象的值 p := point{1, 2} fmt.Printf("%v\n", p) // 如果所格式化的值是一个结构体对象,那么`%+v`的格式化输出 // 将包括结构体的成员名称和值 fmt.Printf("%