How to ignore extra fields for fmt.Sprintf

后端 未结 5 985
天涯浪人
天涯浪人 2021-01-13 13:24

I have a Golang program that reads a string parameter from command line and passes it to the fmt.Sprintf function. Let\'s say tmp_str is the target string from command line.

5条回答
  •  再見小時候
    2021-01-13 13:28

    Yes you can do it, by slicing the arguments you pass to the variadic Sprintf function:

    func TruncatingSprintf(str string, args ...interface{}) (string, error) {
        n := strings.Count(str, "%s")
        if n > len(args) {
            return "", errors.New("Unexpected string:" + str)
        }
        return fmt.Sprintf(str, args[:n]...), nil
    }
    
    func main() {
        tmp_str := "hello %s %s %s"         // don't hesitate to add many %s here
        str, err := TruncatingSprintf(tmp_str, "world") // or many arguments here
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(str)
    }
    

    Demonstration 1

    Demonstration 2 (a different version outputting even when there's more %s than arguments)

    But you don't usually use dynamic formatted strings, this isn't secure and if you want to accept any string, you should also adapt this code to no choke on %%s. If you venture this far, then you should probably have a look at templates (which would let you use named strings, and thus the missing one wouldn't have to be the last one).

提交回复
热议问题