案例一:开发一个简单的HTTP服务器
在Go语言中,创建一个HTTP服务器非常简单。以下是一个基本的HTTP服务器实现案例,它能够响应HTTP请求并返回简单的“Hello, World!”消息。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们定义了一个handler函数,它接受两个参数:w是响应者(.ResponseWriter类型),r是请求者(*http.Request类型)。当有请求发送到我们的服务器时,handler函数会被调用,然后使用fmt.Fprintf将响应发送回客户端。
案例二:使用goroutines进行并发编程
Go语言的并发模型基于goroutines,它是Go运行时(runtime)的一部分,并且比线程更加轻量级。以下是一个使用goroutines的例子,它将两个HTTP请求并行处理。
package main
import (
"fmt"
"net/http"
"sync"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Request %s received at %s\n", r.URL.Path, r.TimeLocal())
}
func main() {
var wg sync.WaitGroup
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
wg.Add(1)
go func() {
defer wg.Done()
handler(w, r)
}()
})
wg.Wait()
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们使用sync.WaitGroup来等待所有goroutines完成。每当一个HTTP请求到来时,我们创建一个新的goroutine来处理它,这样服务器就可以同时处理多个请求。
案例三:使用channel进行线程安全通信
channel是Go语言中的并发通信工具。以下是一个使用channel来安全地共享数据的例子。
package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
messages := make(chan string)
var wg sync.WaitGroup
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
wg.Add(1)
go func() {
defer wg.Done()
messages <- "Message received"
fmt.Fprintf(w, "Message received")
}()
})
go func() {
for msg := range messages {
fmt.Println(msg)
}
}()
wg.Wait()
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们创建了一个messages channel,用来在不同goroutines之间传递消息。当一个HTTP请求到来时,我们发送一个消息到channel。然后在另一个goroutine中,我们监听channel,打印出所有接收到的消息。
案例四:构建RESTful API
使用Go语言创建RESTful API非常直接。以下是一个简单的API服务器,它能够处理GET请求并返回JSON格式的数据。
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Message struct {
Status string `json:"status"`
Content string `json:"content"`
}
func handler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
message := Message{
Status: "ok",
Content: "Hello, World!",
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(message)
default:
http.NotFound(w, r)
}
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们定义了一个Message结构体,用来存储我们想要发送的信息。我们的handler函数检查请求方法,如果请求是GET,它会返回一个包含状态和内容的JSON对象。
通过以上几个案例,我们可以看到Go语言在开发高效、并发处理的Web服务方面是如何强大的。每个案例都是入门级别的,可以帮助你开始使用Go语言,并逐渐提高你的编程技巧。记住,实战是最好的学习方式,所以动手实践并构建自己的项目是非常重要的。
