c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang什么软件

更新时间:2023-10-21
Golang是一种编程语言,最初由Google开发。它的特点是高效、可靠和简单,适用于编写各种应用程序。Golang中有丰富的软件库,使得开发者可以快速构建各种应用程序。下面将介绍一些常用的Golang软件及其用途。

1. Gin

Gin是一款快速的HTTP web框架,具有高度优化的性能。它采用Golang的协程机制,可以轻松处理大量的并发请求。 Gin是目前GitHub上最火的Golang框架之一,其代码量也很少,学习和使用十分方便。


    package main

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

    func main() {
        router := gin.Default()
        router.GET("/ping", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })
        router.Run() 
    }

2. GORM

GORM是一款开源的ORM框架,可用于处理Golang中的关系型数据库。它的使用非常方便,支持MySQL、PostgreSQL等数据库。GORM可以让开发者使用简单的代码来操作数据库,不用频繁地编写SQL语句。


    package main

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

    type User struct {
        gorm.Model
        Name string
        Age  int
    }

    func main() {
        dsn := "root:password@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"

        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            panic("failed to connect database")
        }
        
        //创建表
        db.AutoMigrate(&User{})

        //插入记录
        user := User{Name: "test", Age: 18}
        db.Create(&user)

        //查询记录
        var result User
        db.First(&result, "name = ?", "test")
    }

3. go-micro

go-micro 是一个微服务框架,可以协调不同的服务,提供了微服务的构建、管理和发现相关的功能。它实现了分布式系统中的服务注册、发现、流量控制、负载均衡、链路追踪等功能。


    package main

    import (
        "context"
        "log"

        "github.com/asim/go-micro/v3"
        "github.com/asim/go-micro/v3/server"
    )

    type Greeter struct{}

    func (g *Greeter) Hello(ctx context.Context, req *HelloRequest, rsp *HelloResponse) error {
        rsp.Greeting = "Hello " + req.Name
        return nil
    }

    func main() {
        service := micro.NewService(
        micro.Name("greeter"),
        micro.Version("latest"),
        )

        service.Init()

        err := micro.RegisterHandler(service.Server(), new(Greeter))
        if err != nil {
            log.Fatal(err)
        }

        if err := service.Run(); err != nil {
            log.Fatal(err)
        }
    }

4. go-kit

go-kit是用于微服务和分布式应用程序的工具包,使得这些应用程序变得简单、健壮和可扩展。它将微服务框架分解为可组合的组件,包括进程间通信、服务发现、负载均衡、熔断、日志记录等功能。


    package main

    import (
        "context"
        "fmt"
        "time"

        kitlog "github.com/go-kit/kit/log"
        "github.com/go-kit/kit/log/level"
        "github.com/go-kit/kit/metrics/generic"
        httptransport "github.com/go-kit/kit/transport/http"
        "github.com/gorilla/mux"
    )

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

        r.Methods("POST").Path("/sum").Handler(httptransport.NewServer(
            makeSumEndpoint(),
            decodeSumRequest,
            encodeSumResponse,
        ))

        logger := kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(os.Stdout))
        logger = kitlog.With(logger, "timestamp", kitlog.DefaultTimestampUTC)
        logger = kitlog.With(logger, "caller", kitlog.DefaultCaller)

        level.Info(logger).Log("msg", "HTTP", "addr", ":8080")
        errch := make(chan error)

        go func() {
            errch <- http.ListenAndServe(":8080", r)
        }()

        level.Error(logger).Log("exit", <-errch)
    }

    type sumRequest struct {
        A int `json:"a"`
        B int `json:"b"`
    }

    type sumResponse struct {
        V int `json:"v"`
    }

    func makeSumEndpoint() http.Handler {
        return httptransport.NewServer(
            sumEndpoint,
            decodeSumRequest,
            encodeSumResponse,
        )
    }

    func decodeSumRequest(_ context.Context, r *http.Request) (interface{}, error) {
        var req sumRequest
        if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
            return nil, err
        }
        return req, nil
    }

    func encodeSumResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
        return json.NewEncoder(w).Encode(response)
    }

    func sumEndpoint(ctx context.Context, request interface{}) (interface{}, error) {
        req := request.(sumRequest)
        v := req.A + req.B
        return sumResponse{v}, nil
    }