Ссылаться на один и тот же параметр несколько раз в строке формата fmt.Sprintf - PullRequest
0 голосов
/ 28 октября 2018

У меня есть эта функция:

func getTableCreationCommands(v string) string {
    return `
        CREATE TABLE share_` + v + ` PARTITION OF share FOR VALUES IN (` + v + `);
        CREATE TABLE nearby_` + v + ` PARTITION OF nearby FOR VALUES IN (` + v + `);
    `
}

Это немного шатко ... Есть ли способ отформатировать строку, используя fmt.Sprintf?

Примерно так:

func getTableCreationCommands(v string) string {
    return fmt.Sprintf(`
        CREATE TABLE share_%v PARTITION OF share FOR VALUES IN (%v);
        CREATE TABLE nearby_%v PARTITION OF nearby FOR VALUES IN (%v);
    `, v, v, v, v)
}

но без необходимости проходить v 4 раза?

1 Ответ

0 голосов
/ 28 октября 2018

Пакет fmt

import "fmt" 

Явные индексы аргументов:

В Printf, Sprintf и Fprintf поведение по умолчанию для каждого глагола форматирования:форматировать последовательные аргументы, передаваемые в вызове.Однако запись [n] непосредственно перед глаголом указывает, что вместо этого должен быть отформатирован n-й одноиндексный аргумент.


Вы можете передать переменную v один раз.Например,

package main

import "fmt"

func getTableCreationCommands(v string) string {
    return fmt.Sprintf(`
        CREATE TABLE share_%[1]v PARTITION OF share FOR VALUES IN (%[1]v);
        CREATE TABLE nearby_%[1]v PARTITION OF nearby FOR VALUES IN (%[1]v);
    `, v)
}

func main() {
    fmt.Println(getTableCreationCommands(("X")))
}

Детская площадка: https://play.golang.org/p/DlafU_R_phq

Выход:

CREATE TABLE share_X PARTITION OF share FOR VALUES IN (X);
CREATE TABLE nearby_X PARTITION OF nearby FOR VALUES IN (X);
...