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
オリジナル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()
}
このように起動した後のコンソール画面例:

使用例
設定
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)
...
}
ドキュメント
ライブデモ
特徴
- 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
その他プラグイン
ベンチマーク
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

感謝
本プロジェクトを体験、使用中に貴重な提案やコメント、さらに色々なご支援をしてくれた皆様に、心より感謝いたします!
- 設定管理のモジュール最適化提案 @fujilin
- レスポンダー構文補強最適化提案 @lichuanzhang
- ロゴ美化 @ShuaiRen34
その他
- PR歓迎: pull request
- Issue歓迎: issue
- 本プロジェクトが気に入ったら、ぜひStarをお願いします :)
導入事例
| ロゴ | URL | カテゴリ | 業界 |
|
https://fsx120.cn | Webサイト | 医療 |
|
https://sendflare.com | Webサイト | SaaS |
|
https://stardots.io | Webサイト | SaaS |
|
https://t.me/PiggyPiggyofficialbot | Telegramミニプログラム | Web3 GameFi |
|
- | WeChatミニプログラム | 生活サービス |
|
https://fantagoal.io | Webサイト | Web3 GameFi |
|
- | Webサイト | Web3 GameFi |
|
- | Webサイト | Web3 GameFi |
スポンサー
Star History
関連プロジェクトを探す
freeCodeCamp/freeCodeCamp
freeCodeCamp.org のオープンソースのコードベースとカリキュラムです。数学、プログラミング、コンピュータサイエンスを無料で学べます。
459,003 スターdonnemartin/system-design-primer
大規模システムの設計を学び、システム設計面接の対策ができます。Anki のフラッシュカードが含まれています。
377,617 スターreact/react
Web とネイティブのユーザーインターフェース向けライブラリ。
252,526 スターvuejs/vue
Vue 2 のリポジトリです。Vue 3 については https://github.com/vuejs/core をご覧ください。
212,532 スター


