使用 Go 在 10 分钟内构建服务器 Namaste Go 🙏

2025-06-07

使用 Go 在 10 分钟内构建服务器

合十礼 🙏

微服务架构的引入彻底改变了当今软件的开发方式。后微服务架构取代了单体应用,容器取代了虚拟机。随着这种转变,几乎所有现代软件都基于微服务架构构建。Golang 在构建微服务的开发人员中被广泛使用。它在各行各业都被视为服务器端应用程序开发的热门选择。

Go Starter

Go 是一门非常适合创建简单高效的 Web 服务器和 Web 服务的语言。它提供了一个内置的 HTTP 包,其中包含用于快速创建 Web 或文件服务器的实用程序。

为什么要用 Go 构建后端服务器?🗽

据说,Go 是由谷歌工程师在等待其他程序编译时创建的。由于对 Go 的工具集不满意,他们不得不彻底重新思考系统开发,这促使他们开发了一种精简、高效且经过编译的解决方案,该解决方案支持强大的多线程、并发性和在压力下的性能。

每个寻求规模的组织都在利用 Golang 构建容器化微服务

一些编程语言内存较小,无法与硬件通信。因此,开发人员大多倾向于使用 Golang 来构建软件。此外,Golang 是一种过程式语言,有利于实现可靠、高效且简单的软件。Golang 支持环境接受与其他更高效语言相同的各种模式。自 Go 诞生以来,科技巨头们就已经开始使用它。

使用 Golang 的公司

图形:Bacancy Techology

在现代硬件上运行 Go 语言,无论是在容器内还是在虚拟机中,都是一件令人欣喜的事。Go 语言的设计初衷是为了支持并发,并随着更多核心的添加而扩展,因为它的设计初衷就是在多核上运行。如果您对云原生生态系统感兴趣,那么 Go 语言就是您的入门之选。

我们将构建什么?👨‍🚒

以下教程将包含一个仅包含main.go文件的基本后端服务器的构建。我不会按照目录结构来让应用程序变得复杂。连接数据库会使教程篇幅过长,可能会让刚开始学习 Go 语言的初学者感到困惑。

在应用程序中,我们将学习如何添加多条路由、启动服务器、编写控制器以及执行 GET 和 POST 请求。

服务器系统设计

上面的示意图是为了展示服务器的设计工作方式。我们将要构建的服务器将包含两个路由,一个用于 GET,另一个用于 POST。其中,主页路由将配置为 GET,表单路由将配置为 POST。

先决条件⚙️

如果您的系统尚未安装 Go,请按照官方文档进行安装。相信我,安装过程不会超过 3 分钟。要检查是否已正确安装,只需运行:

go version
Enter fullscreen mode Exit fullscreen mode

当我运行特定命令时,我会得到go version go1.17 darwin/amd64相应的结果。如果你也得到了类似的结果,那么恭喜你🎉,你已经准备好开始你的 Go 后端开发之旅了。

理解:语法

Go 的语法与 C 语言类似,但具备内存安全、垃圾回收、结构化类型和 CSP 风格的并发特性。如果您从未使用过 Golang 编程,并且对其语法一无所知,可以参考 Namaste-Go。这是一个 Go 语言学习库,可以帮助您快速入门。

GitHub 徽标 Aniket762 / namaste-go

一个学习 Go 编程基础知识的资源库。该语言由 Google 工程师开发,但目前在云原生生态系统中被广泛使用。如果您想在该领域开启职业生涯,这里就是您的起点。

合十礼 🙏

项目Namaste Golang (1)






完成基础知识后,让我们开始使用 Go lang 构建后端服务器。

开发后端👨‍💻

让我们创建一个目录goServer并将当前目录更改为该目录。

mkdir goServer && cd goServer
Enter fullscreen mode Exit fullscreen mode

运行命令后,我们就进入了goServer目录,现在只需创建一个main.go文件,并根据你遵​​循的命名约定进行命名,例如server.go。如前所述,为了简单起见,我们不会采用模块化方法。那么,让我们创建文件。

touch main.go
Enter fullscreen mode Exit fullscreen mode

运行该命令,在我们的工作目录中创建一个空文件,即 goServer。

我们需要为 Go 文件定义一个包。由于这将是我们的主要文件,因此我们添加了 main 包。

package main
Enter fullscreen mode Exit fullscreen mode

上面这一行是程序的第一行。

导入包🛍️

现在,让我们导入构建应用程序所需的所有必要包。

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)
Enter fullscreen mode Exit fullscreen mode

现在,让我们了解一下为什么我们的应用程序中包含了这么多包。揭开这些包的神秘面纱:

1️⃣ fmt:用于打印消息
2️⃣ log:用于记录错误
3️⃣ net/http:用于在创建 GO API 时处理 HTTP 请求
4️⃣ gorilla/mux:用于 URL 匹配和路由。它有助于实现请求路由器,并将每个传入的请求与其匹配的处理程序进行匹配。

如果我是你,读完所有导入的内容,我肯定会感到困惑。但是,相信我,一旦你读了这篇博客,我敢打赌,你会清楚地明白我们为什么包含以下软件包。

创建go.mod存储所有必要包的文件,它类似于 package.json。

go mod init github.com/Aniket762/namaste-go/goServer
Enter fullscreen mode Exit fullscreen mode

为了确保 go.mod 文件与模块中的源代码匹配,我们运行

go mod tidy
Enter fullscreen mode Exit fullscreen mode

除一个包外,所有导入的包都已存在于您在安装 Go 时执行的二进制文件中。因此,让我们安装它Gorilla Mux

go get "github.com/gorilla/mux"
Enter fullscreen mode Exit fullscreen mode

如果您是 JavaScript 开发人员,以下命令与npm install <package_name>

最后,在运行程序之前,检查所有代码是否同步。我们添加了一个main()在编译程序时首先执行的函数。

func main() {
    fmt.Printf("Hello from GoServer 👋")
}
Enter fullscreen mode Exit fullscreen mode

总结到目前为止的整个代码库,

package main

import (
    "fmt"
    "log"
    "net/http"


    "github.com/gorilla/mux"
)

func main(){
    fmt.Printf("Hello from GoServer 👋")
}
Enter fullscreen mode Exit fullscreen mode

要运行以下 Go 脚本,请执行以下命令。

go run main.go
Enter fullscreen mode Exit fullscreen mode

如果你进入Hello from GoServer 👋控制台。哇哦!你已经准备好继续下一步了!

构建服务器💪

首先创建一个新的请求路由器。该路由器是我们 Web 应用程序的主路由器,稍后将作为参数传递给服务器。它将接收所有 HTTP 连接,并将其传递给我们在其上注册的请求处理程序。我们在 main 函数中创建该路由器。

r := mux.NewRouter()
Enter fullscreen mode Exit fullscreen mode

注册路由器后,让我们使用 HandleFunction 定义端点。我们通过 r.HandleFunc(...) 调用 HandleFunction。

   r.HandleFunc("/",greetingsHandler).Methods("GET")
   r.HandleFunc("/form",formHandler).Methods("POST")
Enter fullscreen mode Exit fullscreen mode

在 HandleFunc 中,我们提供了两个参数:首先是我们希望在其中看到魔法的路由,其次是执行魔法的具体控制器函数的名称。相应的 GET 和 POST 具有常规含义,要为应用程序构建 CRUD 操作,只需根据路由添加 PUT 和 DELETE 即可。

编写 GET 路由

既然我们已经定义了路由,现在让我们编写控制器。首先从 GreetingsHandler (又名 GET 控制器)开始。

func greetingsHandler(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w,"Greeting from Go Server 👋")
}
Enter fullscreen mode Exit fullscreen mode

默认情况下,此函数接受一个 ResponseWriter 对象来返回响应,以及一个 Request 对象来将参数发送到服务器。控制器只是返回一条消息。

为了检查我们的 GET 函数是否正常工作,让我们在主函数中编写代码来启动服务器。

        fmt.Printf("Starting server at port 8000\n")
    log.Fatal(http.ListenAndServe(":8000",r))
Enter fullscreen mode Exit fullscreen mode

监听和服务功能保持自定义端口开放,这里是 8000。除非程序被中断,否则服务器处于启动状态。

在继续处理 POST 请求之前,我们先检查一下一切是否正常运行。先注释掉 POST 路由,然后开始处理。你的代码应该像这样 👇

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func greetingsHandler(w http.ResponseWriter,r *http.Request){
    fmt.Fprintf(w,"Greeting from Go Server 👋")
}


func main(){
    r := mux.NewRouter()

    r.HandleFunc("/",greetingsHandler).Methods("GET")

    fmt.Println("Hello from GoServer 👋")
    fmt.Printf("Starting server at port 8000\n")
    log.Fatal(http.ListenAndServe(":8000",r))
}
Enter fullscreen mode Exit fullscreen mode

运行服务器🏃‍♂️

现在,我们已经准备好了基本的服务器。让我们创建一个构建并运行它。

使用特定命令,我们在 Windows 上生成 .exe 文件,在 Linux 上生成 .deb 文件。最终生成可执行的二进制文件。

go build
Enter fullscreen mode Exit fullscreen mode

创建二进制文件后,我们通过以下命令执行该文件。

go run main.go
Enter fullscreen mode Exit fullscreen mode

在你常用的浏览器中点击localhost:8000。如果出现如下所示的内容,那就加油吧,你已经完成了 80% 的教程。

获取请求 UI

升级:发布请求🚀

很高兴看到你还在读这篇文章。从 Post 请求开始,你就能体会到 Go 的魅力。我们将使用 JSON 编码,所以,让我们导入另一个模块。

import(
   "encoding/json"
)
Enter fullscreen mode Exit fullscreen mode

首先让我们创建一个简单的结构Founder,它包含姓名、年龄、电子邮件地址和他们创立的公司名称。

type Founder struct{
    Name string `json:"name"`
    Age uint32 `json:"age"`
    Email string `json:"email"`
    Company string `json:"company"`
}
Enter fullscreen mode Exit fullscreen mode

如果你是 JavaScript 开发者,那么结构体类似于 ES6 中的类。现在,让我们定义一个切片,它类似于 C++ 中的向量。

var founders []Founder
Enter fullscreen mode Exit fullscreen mode

切片类似于数组,区别在于,在 Golang 中使用数组时需要定义其长度。这就是为什么我们使用切片的原因,我们还会指定它包含帖子。在这里,founders 是一个 Founder 类型的切片。

让我们将虚拟数据插入到我们的切片中,这样当我们在执行 POST 请求后返回我们的切片时,我们可以在切片中看到多个元素。

founders = append(founders, Founder{Name:"Mehul",Age:23,Email:"random@random.com",Company: "BharatX"})
Enter fullscreen mode Exit fullscreen mode

让我们一步一步地编写 POST 请求处理程序(又称表单处理程序)的脚本。

func formHandler(w http.ResponseWriter, r *http.Request){
     w.Header().Set("Content-Type","application/json")
}
Enter fullscreen mode Exit fullscreen mode

我们在这里为特定的控制器定义 Header。我们只是将 Header 的“Content-Type”设置为“application/json”。

func formHandler(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type","application/json")

    var founder Founder
    json.NewDecoder(r.Body).Decode(&founder)
}
Enter fullscreen mode Exit fullscreen mode

我们在发送请求时会以键值对的形式发送参数。请求对象会使用 decoder 方法分解成字符串。让我们尝试处理一下收到的参数。

func formHandler(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type","application/json")

    var founder Founder
    json.NewDecoder(r.Body).Decode(&founder)

    founder.Age = founder.Age * 2;
    founders = append(founders,founder)

    json.NewEncoder(w).Encode(founders)
}
Enter fullscreen mode Exit fullscreen mode

我们将创始人的年龄乘以 2,并将其附加到切片中。然后,我们使用编码包对所有创始人数据进行编码,并在同一行返回。最后,发送 POST 请求,修改数据,将其附加到切片中,然后返回切片。

因此,您的最终代码应如下所示:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

type Founder struct{
    Name string `json:"title"`
    Age uint32 `json:"age"`
    Email string `json:"email"`
    Company string `json:"company"`
}

var founders []Founder

func greetingsHandler(w http.ResponseWriter,r *http.Request){
    fmt.Fprintf(w,"Greeting from Go Server 👋")
}

func formHandler(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type","application/json")

    var founder Founder
    json.NewDecoder(r.Body).Decode(&founder)

    founder.Age = founder.Age * 2;
    founders = append(founders,founder)

    json.NewEncoder(w).Encode(founders)
}

func main(){
    r := mux.NewRouter()

    founders = append(founders, Founder{Name:"Mehul",Age:23,Email:"random@random.com",Company: "BharatX"})

    r.HandleFunc("/",greetingsHandler).Methods("GET")
    r.HandleFunc("/form",formHandler).Methods("POST")

    fmt.Println("Hello from GoServer 👋")
    fmt.Print("Starting server at port 8000\n")
    log.Fatal(http.ListenAndServe(":8000",r))
}
Enter fullscreen mode Exit fullscreen mode

这个过程还没有结束,让我们检查一下目前开发的内容是否正常工作。首先,让我们构建并启动服务器

go build && go run main.go
Enter fullscreen mode Exit fullscreen mode

使用 Postman 进行 API 测试

现在,让我们转到 Postman。您可以使用任何您想用的,但我更喜欢 Postman。 首先,输入 API 端点(在本例中是),从下拉菜单中选择 POST。导航到 Body 选项卡,选择 raw,然后选择 JSON。写入虚拟数据,这是我编写的:
用于 API 测试的 Postman 设置
http://localhost:8000/form

{
    "name":"Kunal Shah",
    "age":42,
    "email":"kunal@coolguy.com",
    "company":"CRED"
}
Enter fullscreen mode Exit fullscreen mode

点击“发送”按钮。检查状态码和输出结果。如果一切如你所愿,那就值得庆祝了🍻🥳

结尾💚

首先,非常感谢你还在读这篇文章。记住,围棋就像国际象棋,或者说围棋游戏:学习只需片刻,精通则需要一生。幸运的是,与国际象棋不同,围棋的难度会随着经验的积累而降低,很快你就可以用世界上最先进的语言之一编写出速度飞快的程序了。

这篇博文旨在帮助那些热衷于使用 Golang 进行后端开发的程序员快速入门。构建的服务器包含一些基本功能,例如多路由、创建 GET 和 POST 请求、构建二进制文件、运行服务器,并最终帮助大家了解 Go 的工作原理。

我计划撰写更多 Go 后端开发教程。如果您不想错过,请在Twitter上关注我。之后,您可以查看精心整理的Go 文档。如果您对本文有任何疑问,或者想讨论一些其他话题,欢迎随时在 LinkedIn 上与我联系 💖

如果您经营一家组织并希望我编写或创建视频教程,请与我联系🤝

文章来源:https://dev.to/aniket762/build-server-with-go-under-10-minutes-1i9m
PREV
理解软件工程软件工程🔽软件开发生命周期🔽需求与规范🔽设计:架构🔽🟢架构模式🟢架构结论设计:模块化🔽🟢模块化目标🟢耦合介绍🟢内聚介绍🟢内聚结论实施与部署🔽测试概述🔽🟢错误软件维护🔽🟢维护类型🟢版本控制系统🟢结论
NEXT
比较 Gatsby 和 Next.js 在网站开发中的应用