用go语言写一个小服务

发布于:2024-12-08 ⋅ 阅读:(97) ⋅ 点赞:(0)

简介

  • golang的优势
    响应速度:
    Go > Java > Python
    内存占用:
    Go < Java < Python

从java转go,然后go又转java,感觉就是go虽然在编译、内存占用都强于java,但是响应上并没有传说中那么离谱,java完全打得过,并且go语言的框架在20年的时候还不是很完善,当时项目组的工程师亲自手写了一个kafka的生产和消费。。。

go语言给我最大的印象就是非常强悍的协程(轻量化线程),给人一种只要内存够用,就好像能无限开大的感觉。

三种语言的对比

内存管理

Java:

  • JVM负责内存管理
  • 使用垃圾回收(GC)
  • 内存模型明确

Python:

  • PVM负责内存管理
  • 引用计数为主的GC
  • 内存管理相对简单

Go:

  • 编译时内存管理
  • 使用独特的GC机制
  • 内存管理更底层

性能特点

Java:

  • JIT编译优化
  • 启动较慢
  • 运行性能好

Python:

  • 解释执行
  • 性能相对较低
  • 开发效率高

Go:

  • 直接运行机器码
  • 启动快
  • 性能优秀

重新想到go

最近遇到一个问题,其中一个解决方案就是部署一个非常小的实例,实现http对接。
目前编程语言中rust最小,然后是go,rust语言没有接触过,于是想到重拾go语言。

小服务

main.go

package main

import (
    "fmt"
    "net/http"
    "os"
    "path/filepath"
    "github.com/gin-gonic/gin"
)

func main() {
    // 创建 Gin 路由
    r := gin.Default()

    // 创建文件保存目录
    err := createFileDir()
    if err != nil {
        fmt.Printf("创建文件目录失败: %v\n", err)
        return
    }

    // 文件上传接口
    r.POST("/addFile", func(c *gin.Context) {
        // 获取上传的文件
        file, err := c.FormFile("file")
        if err != nil {
            c.JSON(http.StatusBadRequest, gin.H{
                "error": "获取文件失败",
            })
            return
        }

        // 构建保存路径
        dst := filepath.Join("./file", file.Filename)

        // 保存文件
        if err := c.SaveUploadedFile(file, dst); err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "error": "保存文件失败",
            })
            return
        }

        c.JSON(http.StatusOK, gin.H{
            "message": "文件上传成功",
            "filename": file.Filename,
        })
    })

    // hello 接口
    r.GET("/hello", func(c *gin.Context) {
        c.String(http.StatusOK, "hello")
    })

    // 启动服务器,监听 8090 端口
    r.Run(":8090")
}

// 创建文件保存目录
func createFileDir() error {
    return os.MkdirAll("./file", 0755)
}

部署

这里就一个文件,快速部署

go mod init file-handler-server

go get -u github.com/gin-gonic/gin

go run main.go

测试

hello测试

curl http://localhost:8090/hello

文件测试

curl -X POST http://localhost:8090/addFile -F "file=@/path/to/your/file"

结束语

go语言这个文件2kb,运行后也就几M内存消耗,非常夸张,如果java语言来写,习惯spring框架的就直接带上这个沉重的包袱,需要配置jdk,配置maven,部署速度也慢。
总体而言,做一个小功能,go很能打。


网站公告

今日签到

点亮在社区的每一天
去签到