Skip to content
プロジェクト

keepchen/go-sail has 181 GitHub stars and 15 forks. GitHot measured 0 stars in 24 hours and 0 in 7 days. Last checked 2026-11-11 08:44 UTC. Last push 2026-11-02.

この数値の測り方

一个轻量的渐进式Golang Web框架。 A lightweight progressive Web Framework written in Go.

計測したスター増加

24時間
0
7日間
0
15日間
更新が遅れています
1か月
更新が遅れています

期間ごとの純増数です。期間は重複しており、日別の値ではありません。未計測の値は空欄です。スター数は注目度の指標であり、品質の保証ではありません。

README_JA.md

オリジナル

sailboat-solid

Go CodeQL Go Report Card codecov Dependabot Status Snyk Security LICENSE: MIT

LATEST_VERSION

日本語 | 简体中文 | English

go-sailとは?

go-sailはGo言語で実装された軽量プログレッシブWebフレームワークです。新たに車輪の再発明をしたのではなく、巨人の肩の上に立ち、既存の優れたコンポーネントを統合し、最もシンプルな方法でユーザーが安定した信頼性の高いサービスを構築するのを支援します。 その名前が示す通り、Go 言語エコシステムの冒険の始まりとしてお使いください。go-sailは、軽やかに新しい航海へとあなたを導きます。

使い方

goバージョン >= 1.23

go get -u github.com/keepchen/go-sail/v3

import (
    "net/http"
    "github.com/gin-gonic/gin"
    "github.com/keepchen/go-sail/v3/sail"
    "github.com/keepchen/go-sail/v3/sail/config"
)

var (
    conf = &config.Config{}
    registerRoutes = func(ginEngine *gin.Engine) {
        ginEngine.GET("/hello", func(c *gin.Context){
            c.String(http.StatusOK, "%s", "hello, world!")
        })
    }
)

func main() {
    sail.WakeupHttp("go-sail", conf).Hook(registerRoutes, nil, nil).Launch()
}

このように起動した後のコンソール画面例:

launch.png

使用例

設定

parseFn := func(content []byte, viaWatch bool){
    fmt.Println("config content: ", string(content))
    if viaWatch {
        //設定ファイルを再読込...
    }
}
etcdConf := etcd.Conf{
	Endpoints: []string{""},
	Username: "",
	Password: "",
}
key := "go-sail.config.yaml"

sail.Config(parseFn).ViaEtcd(etcdConf, key).Parse(parseFn)

ログトレース

func UserRegisterSvc(c *gin.Context) {
  ...
  sail.LogTrace(c).Warn("ログ出力例...")
  ...
}

JWT認証

  • トークン発行
func UserLoginSvc(c *gin.Context) {
  ...
  uid := "user-1000"
  exp := time.Now().Add(time.Hour * 24).Unix()
  otherFields := map[string]interface{}{
      "nickname": "go-sail",
      "avatar": "https://go-sail.dev/assets/avatar/1.png",
      ...
  }
  ok, token, err := sail.JWT().MakeToken(uid, exp, otherFields)
  ...
}
  • 認証
func UserInfoSvc(c *gin.Context) {
  ...
  ok, claims, err := sail.JWT().ValidToken(token)
  ...
}

コンポーネント

レスポンダー

func UserInfoSvc(c *gin.Context) {
  sail.Response(c).Wrap(constants.ErrNone, resp).Send()
}

データベース

  • 読み取り / 書き込み
func UserInfoSvc(c *gin.Context) {
  uid := "user-1000"
  var user models.User
  //読み取り: ユーザー情報取得
  sail.GetDBR().Where("uid = ?", uid).First(&user)
  ...
  //書き込み: ユーザー情報更新
  sail.GetDBW().Model(&models.User{}).
      Where("uid = ?", uid).
      Updates(map[string]interface{}{
          "avatar": "https://go-sail.dev/assets/avatar/2.png"
      })
}
  • トランザクション
func UserInfoSvc(c *gin.Context) {
  uid := "user-1000"
  err := sail.GetDBW().Transaction(func(tx *gorm.DB){
      e1 := tx.Model(&models.User{}).
              Where("uid = ?", uid).
              Updates(map[string]interface{}{
                  "avatar": "https://go-sail.dev/assets/avatar/2.png"
              }).Error
      if e1 != nil {
          return e1
      }
      e2 := tx.Create(&models.UserLoginHistory{
                Uid: uid,
                ...
              }).Error
      return e2
  })
}

Redis

func UserInfoSvc(c *gin.Context) {
  ...
  sail.GetRedis().Set(ctx, "go-sail:userInfo", "user-1000", time.Hour*24).Result()
  ...
}

パスワード

  • RSA
sail.Password().RSAEncrypt(plaintext, publicKey)

sail.Password().RSADecrypt(encryptedStr, privateKey)
  • Bcrypt
sail.Password().BcryptHashMake(plaintext)

sail.Password().BcryptHashCheck(plaintext, hash)
  • Argon2
sail.Password().Argon2HashMake(plaintext)

sail.Password().Argon2HashCheck(plaintext, hash)
  • Aes
sail.Password().AesGCMEncrypt(plaintext, key)

sail.Password().AesGCMDecrypt(ciphertext, key)
  • SM4
sail.Password().SM4GCMEncrypt(plaintext, key)

sail.Password().SM4GCMDecrypt(ciphertext, key)

タスクスケジューラ

  • インターバル実行
func TodoSomething() {
  fn := func() { ... }
  sail.Schedule("todoSomething", fn).Daily()
}
  • Linux Crontab形式
func TodoSomething() {
  fn := func() { ... }
  sail.Schedule("todoSomething", fn).RunAt("*/5 * * * *")
}
  • レース検出
func TodoSomething() {
  fn := func() { ... }
  sail.Schedule("todoSomething", fn).Withoutoverlapping().RunAt("*/5 * * * *")
}

分散ロック

func UpdateUserBalance() {
  if !sail.RedisLocker().TryLock(key) {
      return false
  }
  defer sail.RedisLocker().Unlock(key)
  ...
}

ドキュメント

https://go-sail.dev

ライブデモ

https://nav.go-sail.dev

特徴

  • HTTPレスポンダー
    • 統一されたレスポンスフィールド
    • HTTPステータスコード管理
    • ビジネスコード管理
  • 様々なコンポーネント
    • データベース
    • メール
    • JWT
    • Kafka
    • ロガー
    • Nacos
    • Etcd
    • Nats
    • Redis
    • Valkey
  • サービス登録・発見
    • Nacos
    • Etcd
  • ツールキット
    • 暗号化・復号化
    • ファイル操作
    • IP
    • 文字列
    • 乱数
    • 日時
    • ...
  • ログ収集・エクスポート
    • ローカルファイル
    • エクスポーター
      • Redis
      • Kafka
      • Nats
  • スケジュールタスク
    • キャンセル可能
    • 単発実行
    • 定期実行
    • Linux Crontab形式
    • レース検出
  • テレメトリ・オブザーバビリティ
    • 呼び出しチェーントレース
    • Prometheus
    • Pprof
    • ログエクスポーター
    • パフォーマンス監視
      • Prometheus
      • Pprof
  • APIエラーコード
    • 動的挿入
    • 多言語対応
  • Redisベース分散ロック
    • ブロッキング
    • 非ブロッキング
  • APIドキュメント生成
    • Redocly
    • Swagger
  • 設定
    • ファイル
    • Etcd
    • Nacos

その他プラグイン

README.md

ベンチマーク

ulimit -n 65535 && sh run_benchmark.sh

テスト結果 (実際のHTTPリクエスト)

goos: darwin
goarch: amd64
pkg: github.com/keepchen/go-sail/v3
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkGoSailParallel-12    88252    12898 ns/op    8860 B/op    92 allocs/op
BenchmarkGinParallel-12       96548    11722 ns/op    7187 B/op    82 allocs/op
PASS
ok    github.com/keepchen/go-sail/v3  3.663s

benchmark-result.png

感謝

本プロジェクトを体験、使用中に貴重な提案やコメント、さらに色々なご支援をしてくれた皆様に、心より感謝いたします!

その他

  • PR歓迎: pull request
  • Issue歓迎: issue
  • 本プロジェクトが気に入ったら、ぜひStarをお願いします :)

導入事例

ロゴ URL カテゴリ 業界
fsx120.cn https://fsx120.cn Webサイト 医療
sendflare.com https://sendflare.com Webサイト SaaS
stardots.io https://stardots.io Webサイト SaaS
Piggy (telegram mini-game) https://t.me/PiggyPiggyofficialbot Telegramミニプログラム Web3 GameFi
生活好評助手-小程序 - WeChatミニプログラム 生活サービス
FantaGoal https://fantagoal.io Webサイト Web3 GameFi
WinGoal - Webサイト Web3 GameFi
Pikaster - Webサイト Web3 GameFi

スポンサー

Powered by DartNode
TempMail100.com StarDots.io

Star History

関連プロジェクトを探す