Golang在框架中真的不需要吗?如果需要应该用哪些框架?

Golang在框架中真的不需要吗?如果需要应该用哪些框架? 你好!最近我在某处读到,Go语言完全不需要框架,那么学习它们的理由是什么呢?除了能加快你的工作速度?在科技公司的实际项目中,通常使用哪些框架?我现在非常困惑……

6 回复

一如既往,这取决于具体情况。没有典型的“真实项目”,只有需求相似或不同的项目。其中一些需求可能使得使用框架变得可行,而另一些则可能不行。

从 Go 标准库开始。

更多关于Golang在框架中真的不需要吗?如果需要应该用哪些框架?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不要仅仅局限于标准库,即使它很优秀。复杂的应用程序需要更多功能,例如路由、用于身份验证或会话的中间件。如果没有一个合适的框架或工具包,很难轻松实现所有这些功能。我个人使用 Gorilla 工具包,但也有许多不错的选择,例如 Echo、Gin 等。

我不太确定我是否理解了;你的观点是,掌握一门语言只是工作的一部分,你需要了解库才能在该语言中成为一名更高效的开发者吗?如果是这样,我同意你需要了解库,但我的观点是,Go 的标准库功能强大。如果你要启动一个新项目并需要从中托管一个网站,我仍然会说,先使用标准库,直到有理由切换为止。

如果你事先知道你将需要功能丰富的工具,那么使用库是有意义的,但与此同时,如果你并不确切知道为什么需要一个库,那么你怎么知道你是否选择了正确的库呢?当有人问“我应该为我的新项目使用哪个 Web 框架?”时,如果不确切知道他们在做什么,很难提供一个有用的答案。人们会根据他们从自己参与的项目中积累的经验来回答,但很难知道那个特定的库是否会对提问者有所帮助。

我仍然认为正确的方法是先使用标准库,直到你确定它不适合你。然后当你向社区询问他们的建议时,你可以提供你所遇到问题的背景,这样他们就能提供相关的建议。

我只用Go来编写自己的个人项目,从未参与过Go的团队开发,所以请对我的建议持保留态度,但我建议默认情况下使用标准库,直到你有理由不这样做。

当你遇到具体场景时,例如:

我遇到了问题 A。我尝试使用标准库中的包 X,但由于 B 的原因,这很困难,并且/或者它导致了与 C 相关的问题……

我建议在这个社区(或类似的社区)发帖询问“我现在应该尝试什么?”。这里的人们会提供有用的答案,比如“我也遇到过那个问题,包 Y 可以解决它”,或者更好的是,“标准库中的包 Z 就是专门为解决这个问题而构建的!”

通过尽量坚持使用标准库,你可以让使用你包的开发者更容易理解它,这样他们既能在自己的项目中放心使用,也更有可能为你的项目做出贡献,因为它是基于标准库的。

然而,当你的问题领域超出了标准库所能解决的范围,确实需要标准库之外的功能时,那么寻找另一个库就是合理的。阿尔伯特·爱因斯坦有句名言:“凡事应尽可能简单,但不宜过于简单。”

lutzhorn 的建议非常棒。请坚持使用标准库。

这样做有很多理由:

  1. 你将学习标准库,它非常出色(无论是质量还是性能)。
  2. 框架通常是在标准库概念的基础上进行扩展,因此,即使你(以后)决定使用框架,如果你已经了解标准库,情况会更好。
  3. 标准库始终与你正在使用的 Go 版本兼容,因为它内置于 Go 发行版中。
  4. 如果你使用外部库,会引入额外的依赖: a) 可能会使编写代码变得更棘手,因为 Go 不允许循环包依赖。 b) 可能会使编译代码变得更棘手(这就是引入 Go 模块的原因)。 c) 外部库的质量参差不齐(有些确实很好,其他的则不然)。 d) 并不总是能明显看出哪些版本的外部库与哪些版本的 Go 兼容。

关于学习 Go 的更多笔记:

GitHub

jeffkayser2/learningGo

关于学习 Go 的笔记。通过在 GitHub 上创建帐户为 jeffkayser2/learningGo 的开发做出贡献。

祝你好运。

在Go语言开发中,是否需要框架取决于具体场景。虽然Go标准库非常强大,但框架确实能提升开发效率,特别是在大型项目中。以下是实际项目中常用的框架及其典型应用场景:

1. Web开发框架

Gin是目前最流行的Web框架,性能优秀且易于使用:

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    
    r.GET("/api/users", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "用户列表",
        })
    })
    
    r.POST("/api/users", func(c *gin.Context) {
        // 处理用户创建逻辑
        c.JSON(201, gin.H{"status": "created"})
    })
    
    r.Run(":8080")
}

Echo是另一个高性能选择,API设计简洁:

package main

import (
    "net/http"
    "github.com/labstack/echo/v4"
)

func main() {
    e := echo.New()
    
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    
    e.Logger.Fatal(e.Start(":1323"))
}

2. 微服务框架

Go-kit适用于构建微服务架构:

package main

import (
    "context"
    "github.com/go-kit/kit/endpoint"
    httptransport "github.com/go-kit/kit/transport/http"
)

func makeEndpoint() endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (interface{}, error) {
        return map[string]string{"status": "ok"}, nil
    }
}

func main() {
    ep := makeEndpoint()
    handler := httptransport.NewServer(
        ep,
        decodeRequest,
        encodeResponse,
    )
    
    http.Handle("/api", handler)
}

3. 全栈框架

Buffalo提供完整的开发体验:

package actions

import (
    "github.com/gobuffalo/buffalo"
    "github.com/gobuffalo/envy"
)

var app *buffalo.App

func App() *buffalo.App {
    if app == nil {
        app = buffalo.New(buffalo.Options{
            Env: envy.Get("GO_ENV", "development"),
        })
        
        app.GET("/", HomeHandler)
        app.ServeFiles("/assets", assetsBox)
    }
    return app
}

4. ORM框架

GORM是最常用的ORM:

package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    gorm.Model
    Name  string
    Email string `gorm:"uniqueIndex"`
}

func main() {
    dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("连接数据库失败")
    }
    
    // 自动迁移
    db.AutoMigrate(&User{})
    
    // 创建用户
    db.Create(&User{Name: "张三", Email: "zhangsan@example.com"})
}

实际项目中的选择标准

科技公司通常根据以下因素选择框架:

  1. 项目规模:小型API可能只用标准库,大型系统需要完整框架
  2. 团队熟悉度:已有技术栈和经验
  3. 性能要求:高并发场景选择Gin/Echo,需要快速开发选Buffalo
  4. 生态支持:中间件、插件、社区活跃度

性能对比示例

// 标准库实现
func stdHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
}

// Gin框架实现
func ginHandler(c *gin.Context) {
    c.JSON(200, gin.H{"status": "ok"})
}
// 两者性能差异在微秒级别,但对开发效率影响显著

在科技公司实际项目中,约70%的团队会使用框架加速开发,特别是需要快速迭代的业务系统。完全不用框架的情况多见于基础设施、工具类项目或对性能有极端要求的场景。

学习框架的理由很明确:它们提供了经过验证的最佳实践、标准化项目结构、丰富的中间件生态,并能显著减少重复代码。例如,Gin的路由性能比标准库高30%,且提供了参数绑定、验证、中间件链等生产级功能。

回到顶部