文章目录
- 简介
- 重新想到go
- 小服务
- main.go
- 部署
- 测试
- 结束语
简介
- 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很能打。