Есть ли способ сделать обратный результат Sprintf - PullRequest
1 голос
/ 24 апреля 2020

Итак, я создал строковую переменную, используя

name := "Batman"
age := 38
nameAndAge = fmt.Sprintf("%s %d", name, age)

В другой функции я могу получить доступ к переменной nameAndAge. Теперь я хочу вернуть обе переменные, которые я использовал в Sprintf. Один из забытых способов, о котором я могу подумать, это разделить его на основе разделителя и создать переменную. Я хотел знать, есть ли какая-либо функция для этого?

Как,

var name string
var age int
// " " is the separator here
fmt.ReverseSprintf(nameAndAge, " ", name, age)

Спасибо за помощь.

1 Ответ

4 голосов
/ 24 апреля 2020

В некоторой степени это возможно, для этого есть fmt.Sscanf(). Цитирование из пакета do c из fmt: сканирование :

Scanf, Fscanf и Sscanf анализируют аргументы в соответствии со строкой формата, аналогичной Printf.

См. Этот пример:

name := "Batman"
age := 38
output := fmt.Sprintf("%s %d", name, age)

fmt.Println(output)

var name2 string
var age2 int
if _, err := fmt.Sscanf(output, "%s %d", &name2, &age2); err != nil {
    fmt.Println("error", err)
}
fmt.Println(name2, age2)

Вывод (попробуйте на игровой площадке Go ):

Batman 38
Batman 38

Я написал «до некоторой степени», потому что ваш пример был довольно прост. Если бы ваш name содержал пробелы, вышеприведенный пример сломался бы:

name := "Batman Robin"
// The rest is the same

Вывод будет:

Batman Robin 38
error expected integer
Batman 0

Причина этого заключается в том, что в нашем формате string мы использовали пространство для разделения входных данных, и если само пространство содержится во входных данных, процесс реверса не может определить разницу. Кроме того, функции сканирования обрабатывают символы новой строки во входных данных как пробелы, среди прочих различий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...