首页 > 其他分享 >Cobra - How to avoid access global variables in a global variable or init() function

Cobra - How to avoid access global variables in a global variable or init() function

时间:2024-06-23 22:33:33浏览次数:22  
标签:function Cobra return err nil currentFile global values file

在同一个package中的init()函数是按照所在文件文件名的字母顺序执行的,如果一个文件排在root.go之前,那么在其中字义的<文件名>Cmd全局变量赋值时将不能使用在root.go中初始化并赋值的全局变量(如global flags),同样在其init()函数中也不能使用那些全局变量,如果使用则会报空指针错误。

 

解决办法:在每个命令文件中定义一个run()函数,在<文件名>Cmd的Run域中调用它。

 

示例:

在root.go中有个--log persistent flag,其对应全局变量enableLogging,根据enableLogging值的真假为另一个全局变量logger赋值:

var enableLogging bool
var logger *slog.Logger

func init() {
    rootCmd.PersistentFlags().BoolVarP(&enableLogging, "log", "l", true, "Logging information")

    ......

    setDefaultLogger()
}

在insert.go中:

var file string

// insertCmd represents the insert command
var insertCmd = &cobra.Command{
    Use:   "insert",
    Short: "insert command",
    Long:  `A longer description of the insert command.`,
    Run: func(cmd *cobra.Command, args []string) {
        insertRun()
    },
}

func init() {
    rootCmd.AddCommand(insertCmd)
    insertCmd.Flags().StringVarP(&file, "file", "f", "", "Filename to process")
    insertCmd.MarkFlagRequired("file")
}

func insertRun() {
    if file == "" {
        fmt.Println("Need a file to read!")
        return
    }

    _, ok := index[file]
    if ok {
        fmt.Println("Found key:", file)
        delete(index, file)

        // Now, delete it from data
        for i, k := range data {
            if k.Filename == file {
                data = slices.Delete(data, i, i+1)
                break
            }
        }
    }

    err := ProcessFile(file)
    if err != nil {
        fmt.Println(err)
        return
    }

    err = saveJSONFile(JSONFILE)
    if err != nil {
        fmt.Printf("Error saving data: %s", err)
    }
}

func readFile(filepath string) (values []float64, err error) {
    _, err = os.Stat(filepath)
    if err != nil {
        return nil, err
    }

    f, err := os.Open(filepath)
    if err != nil {
        return nil, err
    }
    defer f.Close()

    lines, err := csv.NewReader(f).ReadAll()
    if err != nil {
        return nil, err
    }

    values = make([]float64, 0, len(lines))
    for i, line := range lines {
        value, err4 := strconv.ParseFloat(line[0], 64)
        if err4 != nil {
            logger.Error(fmt.Sprintln("Invalid value", line[0], "in line", i, err4))

            if err == nil {
                err = errors.New("failed to read at least one value")
            }
        }
        values = append(values, value)
    }

    return
}

func ProcessFile(file string) error {
    currentFile := Entry{}
    currentFile.Filename = file

    values, err := readFile(file)
    if err != nil {
        return err
    }

    currentFile.Len = len(values)
    currentFile.Minimum = slices.Min(values)
    currentFile.Maximum = slices.Max(values)
    currentFile.Mean, currentFile.StdDev = stdDev(values)

    data = append(data, currentFile)

    return nil
}

 

标签:function,Cobra,return,err,nil,currentFile,global,values,file
From: https://www.cnblogs.com/zhangzhihui/p/18264023

相关文章

  • Java8 Consumer、Supplier、Predicate、Function
    今天我们还讲讲Consumer、Supplier、Predicate、Function这几个接口的用法,在Java8的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声的。为什么这么说呢?这几个接口都在java.util.function包下的,分别是Consumer(消费型)、supplier(供给型)、predicate(谓词型)、functi......
  • def __init__(self,parameterlist)初始化方法和def __functionName__(self,parameterl
    问题描述:def__init__(self,parameterlist)初始化方法和def__functionName__(self,parameterlist)实例方法,其中functionName是具体方法的名字,比如表示奔跑、或者狗叫的方法。对于上面这两种方法有什么区别?问题解答:在Python类中,__init__方法和其他实例方法(如__functionName_......
  • a regrex for function title
    正则表达式简明扼要,一行代码就能实现挺复杂的功能。deftitle(s):returnre.sub(rb"[A-Za-z]+('[A-Za-z]+)?",lambdamo:mo.group(0)[0:1].upper()+lambdamo:mo.group(0)[1:].lower(),s)解释正则表达式"[A-Za-z]+('[A-Za-z]+)?"的作用是匹配一个或多个英文字母(大小写......
  • RAG与LLM原理及实践(2)--- RAG结合LLM function调用的原理及落地实践
    花一点时间继续写下,RAG结合LLM。通过上一篇文章你应该知道为什么RAG要结合LLM,或者说为什么LLM要结合RAG使得LLM更强大,特别是当LLM应用在人机对话等方面的时候。只要涉及一问一答,并通过上下文继续丰富对话,就会涉及到他。这个是看事情的两个维度。就像是买钟送电池还是买电池送......
  • puppeteer exposeFunction 方法简单试用
    以下简单演示下puppeteerexposeFunction的使用环境准备基于browserlessdocker-composeversion:"3"services:nginx:image:nginx:alpinevolumes:-./index.html:/usr/share/nginx/html/index.htmlports:-"80......
  • ERROR TypeError: this.nzData.slice is not a function
    原文链接:ERRORTypeError:this.nzData.sliceisnotafunction–每天进步一点点(longkui.site) 使用angular+ngzorro的nz-table渲染表格的时候报错:ERRORTypeError:this.nzData.sliceisnotafunction我的html部分代码如下:<nz-table#basicTable2[nzData]="lis......
  • 【效率提升】倍速插件Global Speed
    globalspeed插件可以控制网页在线视频,能够应用在Edge和Google浏览器中,只需要在插件商店中下载并配置即可。这款插件的配置选项有很多,支持视频倍速(最低0.25倍速,最高16倍速),固定标签页,设置标记点,跳转标记点,循环播放等。除此之外,还有更多可以选择的配置。一般情况下,我都是打......
  • Vitis HLS 学习笔记--函数例化(Function Instantiation)
    目录1.简介2.功能分析3.示例分析3.1不使用 FUNCTION_INSTANTIATE3.2使用 FUNCTION_INSTANTIATE4.总结1.简介函数例化(FunctionInstantiation)是VitisHLS中的一个高级优化技术。它允许开发者在保持函数层次结构的同时,对函数的特定实例进行局部优化。如果函......
  • python调用智能合约代码,BadFunctionCallOutput 怎么解决
    目录桌面应用使用QT5开发的,可以看看我的QT5文章BadFunctionCallOutput 怎么解决我的原因是智能合约地址填写错误python智能合约基础应用如何使用remix编写solidity智能合约并部署上链在哪进行合约部署,合约部署步骤Remix怎么复制abi和address​编辑这个ABI对应最简......
  • Java - function
     Java-Assignment04(100pts)InstructionsWriteeachexerciseinitsownmethod.Uncommentthefunctioncallsinmain()toactivateeachexercise.Referto"Assignment01"ifnecessary.Foreachexercise,usecommentstowritepseudocodew......