使用 Go-Spring 構建最小 Web API

李輕水 發表於 2021-11-27
Spring Go

前言

Go 語言以簡單著稱,一個很明顯的例子就是隻需要很少的程式碼即可實現一個最小的 Web API 。Go-Spring 融合了 Go 簡單和 Spring 自動配置的優點。本文通過幾個實現最小 Web API 的示例展示 Go-Spring 的簡單和強大。

To Gopher

下面是使用 Go 標準庫實現的 Hello World! 程式。程式碼真的很少!

package main

import (
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World!"))
  })
  http.ListenAndServe(":8080", nil)
}

Gin 是目前最火的 Web 框架之一,它實現的 Hello World! 程式如下。也很簡單。

package main

import (
  "github.com/gin-gonic/gin"
  "github.com/gin-gonic/gin/ginS"
)

func main() {
  ginS.GET("/", func(c *gin.Context) {
    c.String(200, "Hello World!")
  })
  ginS.Run()
}

再來看看使用 Go-Spring 實現的 Hello World! 程式。同樣很簡單。

package main

import (
  "github.com/go-spring/spring-core/gs"
  "github.com/go-spring/spring-core/web"
  _ "github.com/go-spring/starter-gin"
)

func main() {
  gs.GetMapping("/", func(ctx web.Context) {
    ctx.String("Hello World!")
  })
  gs.Run()
}

但是,可以注意到使用 Go-Spring 實現的示例中有一個匿名匯入的包,它的作用是告訴 Hello World! 程式使用 Gin 作為底層 Web Server 實現。如果我們把這一行改為如下程式碼,程式仍然可以正常執行,但是這時候程式使用 Echo 作為底層 Web Server 實現。

_ "github.com/go-spring/starter-echo"

雖然 Go-Spring 多了一行匿名包匯入,但因此獲得了比標準庫更強大的能力。

To Javaer

Go-Spring 雖然提供了和 Go 標準庫一樣的程式設計模型,但本質上它是基於 IoC (依賴注入) 實現的,因此它具有標準庫不具備的自動配置能力,而且與 Java Spring Boot 相比,Go-Spring 的程式設計效率也不差。

下面是使用 Java Spring Boot 實現的一個 Hello World! 程式,但是與上面的示例不同,為了展示 Java Spring 的依賴注入能力,它同時會列印 JAVA_HOME 環境變數的值。程式碼如下。


package com.example.demo11;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class MyController {

  @Value("${JAVA_HOME}")
  String JavaHome;

  @GetMapping("/")
  public String hello() {
    return this.JavaHome + " - Hello World!";
  }

}

@SpringBootApplication
public class Demo11Application {

  public static void main(String[] args) {
    SpringApplication.run(Demo11Application.class, args);
  }

}

下面是使用 Go-Spring 的依賴注入能力實現的能同時列印 GOPATH 環境變數和 Hello World! 的程式。程式碼如下。

package main

import (
  "github.com/go-spring/spring-core/gs"
  "github.com/go-spring/spring-core/web"
  _ "github.com/go-spring/starter-gin"
)

func init() {
  gs.Object(new(MyController)).Init(func(c *MyController) {
    gs.GetMapping("/", c.Hello)
  })
}

type MyController struct {
  GoPath string `value:"${GOPATH}"`
}

func (c *MyController) Hello(ctx web.Context) {
  ctx.String(c.GoPath + " - Hello World!")
}

func main() {
  gs.Run()
}

比較上面兩個示例,可以看出 Go-Spring 真正實現了 Go 和 Java Spring 的融合,在保持 Go (語法) 簡單的同時具備 Java Spring 的強大配置能力。

通過本文的介紹,你有沒有對 Go-Spring 動心呢?趕緊動手試試吧!

官網及交流

Go-Spring 官網
Github

本作品採用《CC 協議》,轉載必須註明作者和本文連結