在Web开发中,URL短链接服务可以把很长的网址压缩成简短易记的链接,方便分享与统计。使用Golang来实现这类服务非常合适,因为Go自带高效的HTTP能力和并发模型。下面介绍如何设计并实现一个具备生成与解析短链接功能的服务。

核心设计思路
短链接服务主要包含两个过程:生成短码和解析短码。生成时,我们可以采用自增ID加进制转换的方式,将数字ID转为62进制字符串作为短码;解析时,根据短码反查原始URL并返回302跳转。
数据存储
为简单演示,我们使用一个内存中的map来保存短码与原URL的映射。生产环境可替换为Redis或MySQL等。
生成短链接的代码实现
以下示例展示如何用Golang生成短码并提供HTTP接口:
package main
import (
"fmt"
"net/http"
"sync"
)
var (
mu sync.Mutex
idCounter uint64 = 0
urlMap = make(map[string]string)
)
// 将数字转为62进制短码
func toBase62(num uint64) string {
chars := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
if num == 0 {
return "0"
}
var result []byte
for num > 0 {
result = append([]byte{chars[num%62]}, result...)
num /= 62
}
return string(result)
}
func genShortURL(w http.ResponseWriter, r *http.Request) {
longURL := r.URL.Query().Get("url")
if longURL == "" {
fmt.Fprintln(w, "missing url parameter")
return
}
mu.Lock()
idCounter++
shortCode := toBase62(idCounter)
urlMap[shortCode] = longURL
mu.Unlock()
fmt.Fprintf(w, "http://127.0.0.1:8080/%s", shortCode)
}
func main() {
http.HandleFunc("/gen", genShortURL)
http.ListenAndServe(":8080", nil)
}
解析短链接的实现
解析接口接收短码路径,查表后做跳转。我们在同一个服务中补充解析处理函数。
package main
import (
"net/http"
"strings"
)
func redirectShortURL(w http.ResponseWriter, r *http.Request) {
code := strings.TrimPrefix(r.URL.Path, "/")
if longURL, ok := urlMap[code]; ok {
http.Redirect(w, r, longURL, http.StatusFound)
return
}
http.NotFound(w, r)
}
func main() {
http.HandleFunc("/gen", genShortURL)
http.HandleFunc("/", redirectShortURL)
http.ListenAndServe(":8080", nil)
}
关于HTML标签的说明
在Go的HTTP处理中,我们使用的<form>或<input>等前端标签与后端逻辑无关,后端只处理路径与参数。函数调用如strings.TrimPrefix()用于截取短码,不是标签。
小结
通过上述代码,我们完成了一个基础URL短链接服务的生成与解析功能。你可以将存储改为持久化方案,并增加访问统计、自定义短码等能力来完善系统。