实战案例一:构建一个简单的Web服务器
1. 简介
Go语言因其并发性能和简洁的语法而广受欢迎。在这个案例中,我们将使用Go语言构建一个简单的Web服务器,以便更好地理解其基础语法和并发特性。
2. 代码实现
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)
}
3. 运行与测试
- 保存以上代码为
main.go。 - 在终端中运行
go run main.go。 - 打开浏览器,访问
http://localhost:8080,你会看到“Hello, World!”的输出。
4. 学习点
http.HandleFunc用于注册一个处理函数。http.ListenAndServe用于启动Web服务器。
实战案例二:实现一个并发下载器
1. 简介
在这个案例中,我们将使用Go语言的并发特性来实现一个简单的下载器,可以从多个源并发下载文件。
2. 代码实现
package main
import (
"fmt"
"io"
"net/http"
"os"
"sync"
)
func download(url string, wg *sync.WaitGroup, done chan bool) {
defer wg.Done()
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error fetching URL:", err)
return
}
defer resp.Body.Close()
file, err := os.Create(url)
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
_, err = io.Copy(file, resp.Body)
if err != nil {
fmt.Println("Error copying response body:", err)
return
}
done <- true
}
func main() {
urls := []string{
"http://example.com/file1.zip",
"http://example.com/file2.zip",
"http://example.com/file3.zip",
}
var wg sync.WaitGroup
done := make(chan bool, len(urls))
for _, url := range urls {
wg.Add(1)
go download(url, &wg, done)
}
wg.Wait()
close(done)
fmt.Println("All files downloaded.")
}
3. 运行与测试
- 保存以上代码为
main.go。 - 在终端中运行
go run main.go。 - 稍等片刻,你会看到所有文件都已被下载。
4. 学习点
sync.WaitGroup用于等待多个goroutine完成。io.Copy用于将数据从源复制到目标。
实战案例三:实现一个简单的RESTful API
1. 简介
在这个案例中,我们将使用Go语言的net/http包来实现一个简单的RESTful API,用于处理用户注册和登录请求。
2. 代码实现
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
var users = make(map[string]string)
func registerHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
return
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading request body", http.StatusInternalServerError)
return
}
defer r.Body.Close()
var user User
if err := json.Unmarshal(body, &user); err != nil {
http.Error(w, "Error unmarshalling request body", http.StatusInternalServerError)
return
}
users[user.Username] = user.Password
w.WriteHeader(http.StatusOK)
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
return
}
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading request body", http.StatusInternalServerError)
return
}
defer r.Body.Close()
var user User
if err := json.Unmarshal(body, &user); err != nil {
http.Error(w, "Error unmarshalling request body", http.StatusInternalServerError)
return
}
if password, exists := users[user.Username]; exists && password == user.Password {
w.WriteHeader(http.StatusOK)
} else {
http.Error(w, "Invalid username or password", http.StatusUnauthorized)
}
}
func main() {
http.HandleFunc("/register", registerHandler)
http.HandleFunc("/login", loginHandler)
http.ListenAndServe(":8080", nil)
}
3. 运行与测试
- 保存以上代码为
main.go。 - 在终端中运行
go run main.go。 - 使用Postman或curl工具测试API。
4. 学习点
json.Unmarshal用于解析JSON数据。http.HandleFunc用于注册处理函数。
通过以上三个实战案例,我们可以更好地理解Go语言的基础语法和并发特性。在实际项目中,你可以根据自己的需求选择合适的案例进行学习和实践。
