最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go如何使用cobra啟動項目

 更新時間:2025年11月26日 10:42:49   作者:水痕01  
本文介紹了如何使用Go語言的Cobra庫來啟動項目,包括基本使用和項目開發(fā)中的具體實現(xiàn),本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

一、基本使用

1、安裝依賴包

go get -u github.com/spf13/cobra@latest

2、簡單的創(chuàng)建幾個命令

package main
import (
	"github.com/spf13/cobra"
	"os"
)
var rootCmd = &cobra.Command{
	Use:   "api",
	Short: "短的地址",
	Long:  "長的地址",
}
// 命令一
var mockCmd = &cobra.Command{
	Use:   "mock",
	Short: "mock短的",
	Long:  "mock長的",
}
// 命令二
var exportCmd = &cobra.Command{
	Use:   "export",
	Short: "export短的",
	Long:  "export長的",
}
func main() {
	rootCmd.AddCommand(mockCmd)
	rootCmd.AddCommand(exportCmd)
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

3、運行上面的代碼

go run main.go mock ---> 輸出mock長的
go run main.go export --> export長的

4、常見的字段說明

  • PersistentPreRunE執(zhí)行之前,且在任何子命令運行之前都會調用
  • PersistentPostRun執(zhí)行之后,且在所有子命令執(zhí)行后都會調用
  • RunE當命令的主要邏輯執(zhí)行時觸發(fā),即命令的核心功能實現(xiàn)

5、加載外面?zhèn)鬟f的參數(shù)

先定義接收的變量

var name string

使用命名接收外面的數(shù)據(jù)

func init() {
	rootCmd.PersistentFlags().StringVarP(&name, "name", "n", "", "外部傳遞值進來")
}

運行命令

go run main.go export -n=hello

二、實現(xiàn)項目中開發(fā)使用

1、比如我們日常gin項目開發(fā)

├── api
│   └── service.go
├── cmd
│   ├── root.go
│   └── start.go
├── config
│   └── config.go
├── etc
│   ├── application.dev.yml
│   └── application.prod.yml
├── main.go

2、cmd/root.go的文件

package cmd
import (
	"fmt"
	"gin-admin-api/test251119/config"
	"github.com/spf13/cobra"
	"os"
)
var (
	cfgFile string
	cfg     *config.Config
)
var rootCmd = &cobra.Command{
	Use:   "cmd",
	Short: "gin項目開發(fā)啟動",
	Long:  "gin項目開發(fā)啟動",
	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
		if cmd.Name() == "help" {
			return nil
		}
		// 加載配置文件
		var err error
		cfg, err = config.Load(cfgFile)
		if err != nil {
			return fmt.Errorf("加載配置文件失敗: %w", err)
		}
		return nil
	},
	PersistentPostRun: func(cmd *cobra.Command, args []string) {
		// TODO 可以做數(shù)據(jù)庫的關閉
	},
}
func init() {
	rootCmd.PersistentFlags().StringVarP(&cfgFile, "etc", "c", "etc/application.dev.yml", "請輸入啟動的配置文件")
}
func Execute() {
	rootCmd.AddCommand(cmdStart)
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

3、cmd/start.go文件

package cmd
import (
	"fmt"
	"gin-admin-api/test251119/api"
	"github.com/spf13/cobra"
	"os"
)
var cmdStart = &cobra.Command{
	Use:   "start",
	Short: "啟動項目",
	Long:  "啟動項目",
	Run: func(cmd *cobra.Command, args []string) {
		if err := startDaemon(); err != nil {
			fmt.Fprintf(os.Stderr, "Error: %v\n", err)
			os.Exit(1)
		}
	},
}
func startDaemon() error {
	server := api.NewServer(cfg)
	err := server.ListenAndServe()
	return err
}

4、config/config.go文件內容

package config
import (
	"fmt"
	"github.com/spf13/viper"
	"os"
	"path/filepath"
)
type Config struct {
	Port int `mapstructure:"port"` // 啟動端口
}
// Load loads configuration from file
func Load(cfgFile string) (*Config, error) {
	v := viper.New()
	if cfgFile != "" {
		v.SetConfigFile(cfgFile)
	} else {
		configDir := "./etc"
		if _, err := os.Stat(configDir); os.IsNotExist(err) {
			if err := os.MkdirAll(configDir, 0755); err != nil {
				return nil, fmt.Errorf("創(chuàng)建目錄失敗: %w", err)
			}
		}
		v.AddConfigPath(configDir)
		v.SetConfigName("application.dev")
		v.SetConfigType("yml")
		configPath := filepath.Join(configDir, "application.dev.yml")
		if _, err := os.Stat(configPath); os.IsNotExist(err) {
			fmt.Println("Config file not found, creating default config:", configPath)
			// Copy example file if it exists
			examplePath := filepath.Join(configDir, "application.dev.example")
			if _, err := os.Stat(examplePath); err == nil {
				if exampleData, err := os.ReadFile(examplePath); err == nil {
					if err := os.WriteFile(configPath, exampleData, 0644); err != nil {
						fmt.Printf("寫入默認配置文件失敗: %v\n", err)
					} else {
						fmt.Println("讀取默認配置文件 成功")
					}
				}
			}
		}
	}
	// 設置默認值
	v.SetDefault("port", ":8080")
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("reading config file: %w", err)
	}
	fmt.Println("Using config file:", v.ConfigFileUsed())
	var config Config
	if err := v.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("unmarshaling config: %w", err)
	}
	return &config, nil
}

5、api/service.go文件內容

package api
import (
	"fmt"
	"gin-admin-api/test251119/config"
	"github.com/gin-gonic/gin"
	"net/http"
)
type Server struct {
	server *http.Server
	router *gin.Engine
	config *config.Config
}
// NewServer 創(chuàng)建新的 Server 實例
func NewServer(cfg *config.Config) *Server {
	gin.SetMode(gin.DebugMode)
	router := gin.Default()
	router.Use(gin.Recovery())
	// 創(chuàng)建 HTTP 服務器
	srv := &http.Server{
		Addr:    fmt.Sprintf(":%d", cfg.Port),
		Handler: router,
	}
	return &Server{
		server: srv,
		router: router,
		config: cfg,
	}
}
// ListenAndServe 啟動服務并監(jiān)聽端口
func (s *Server) ListenAndServe() error {
	fmt.Printf("服務啟動:http://localhost:%d\n", s.config.Port)
	// 啟動服務并修復端口格式
	return s.server.ListenAndServe()
}

6、application.dev.yml文件

port: 9000
salt: abcdef

7、啟動文件main.go

package main
import "gin-admin-api/test251119/cmd"
func main() {
	cmd.Execute()
}

8、啟動

go run main.go start  默認使用dev文件
go run main.go start -c etc/application.prod.yml

到此這篇關于go使用cobra來啟動項目的文章就介紹到這了,更多相關go cobra啟動項目內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go實現(xiàn)grpc四種數(shù)據(jù)流模式

    go實現(xiàn)grpc四種數(shù)據(jù)流模式

    這篇文章主要為大家介紹了go實現(xiàn)grpc四種數(shù)據(jù)流模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang?分割字符串的實現(xiàn)示例

    Golang?分割字符串的實現(xiàn)示例

    本文主要介紹了Golang?分割字符串的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • golang中for循環(huán)遍歷channel時需要注意的問題詳解

    golang中for循環(huán)遍歷channel時需要注意的問題詳解

    這篇文章主要給大家介紹了關于golang中for循環(huán)遍歷channel時需要注意的問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • golang通過http訪問外部網(wǎng)址的操作方法

    golang通過http訪問外部網(wǎng)址的操作方法

    這篇文章主要介紹了golang通過http訪問外部網(wǎng)址的操作方法,分為?get方式訪問外部的接口,Post方式請求外部接口,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • golang中gob的實現(xiàn)示例

    golang中gob的實現(xiàn)示例

    本文介紹了Go語言的Gob格式,它是Go以二進制形式序列化和反序列化程序數(shù)據(jù)的格式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-11-11
  • 重學Go語言之如何開發(fā)RPC應用

    重學Go語言之如何開發(fā)RPC應用

    這篇文章主要為大家詳細介紹了在Go語言中如何構建RPC應用,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • Golang?WaitGroup?底層原理及源碼解析

    Golang?WaitGroup?底層原理及源碼解析

    WaitGroup?是?Golang?中最常見的并發(fā)控制技術之一,它的作用我們可以簡單類比為其他語言中多線程并發(fā)控制中的?join(),這篇文章主要介紹了Golang?WaitGroup?底層原理及源碼詳解,需要的朋友可以參考下
    2023-04-04
  • go module使用本地包的方法示例

    go module使用本地包的方法示例

    這篇文章主要介紹了go module使用本地包的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • golang 實現(xiàn)菜單樹的生成方式

    golang 實現(xiàn)菜單樹的生成方式

    這篇文章主要介紹了golang 實現(xiàn)菜單樹的生成方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang讀取各種配置文件(ini、json、yaml)

    golang讀取各種配置文件(ini、json、yaml)

    日常項目中,讀取各種配置文件是避免不了的,本文主要介紹了golang讀取各種配置文件(ini、json、yaml),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05

最新評論

榆林市| 什邡市| 柘城县| 蓬安县| 兴隆县| 宽城| 禹城市| 高唐县| 绍兴县| 灵璧县| 双辽市| 湾仔区| 尼木县| 丹巴县| 师宗县| 樟树市| 巢湖市| 安西县| 利津县| 凌源市| 稻城县| 通化市| 筠连县| 龙海市| 柏乡县| 上蔡县| 阿合奇县| 苍梧县| 黄骅市| 高唐县| 札达县| 清流县| 沧源| 罗田县| 北辰区| 来凤县| 泽普县| 临湘市| 广汉市| 天水市| 苏尼特右旗|