¿Hay una manera simple de formatear una cadena en Go sin imprimir la cadena?
Puedo hacer:
bar := "bar"
fmt.Printf("foo: %s", bar)
Pero quiero que la cadena formateada se devuelva en lugar de imprimirse para poder manipularla más.
También podría hacer algo como:
s := "foo: " + bar
Pero esto se vuelve difícil de leer cuando la cadena de formato es compleja y engorrosa cuando una o muchas de las partes no son cadenas y tienen que convertirse primero, como
i := 25
s := "foo: " + strconv.Itoa(i)
¿Hay una manera más simple de hacer esto?
string
go
formatting
string-formatting
Carnegie
fuente
fuente
1. Cuerdas simples
Para cadenas "simples" (típicamente lo que cabe en una línea) la solución más simple es usar
fmt.Sprintf()
y amigos (fmt.Sprint()
,fmt.Sprintln()
). Estas son análogas a las funciones sin laS
letra de inicio , pero estasSxxx()
variantes devuelven el resultado enstring
lugar de imprimirlas en la salida estándar.Por ejemplo:
La variable
s
se inicializará con el valor:Sugerencia: Si solo desea concatenar valores de diferentes tipos, es posible que no necesite usarlos automáticamente
Sprintf()
(lo que requiere una cadena de formato) comoSprint()
hace exactamente esto. Ver este ejemplo:Para concatenar solo
string
s, también puede usarstrings.Join()
donde puede especificar un separador personalizadostring
(que se colocará entre las cadenas para unir).Pruébalos en Go Playground .
2. Cadenas complejas (documentos)
Si la cadena que está intentando crear es más compleja (por ejemplo, un mensaje de correo electrónico de varias líneas), se
fmt.Sprintf()
vuelve menos legible y menos eficiente (especialmente si tiene que hacerlo muchas veces).Para esto, la biblioteca estándar proporciona los paquetes
text/template
yhtml/template
. Estos paquetes implementan plantillas basadas en datos para generar resultados textuales.html/template
es para generar salida HTML segura contra la inyección de código. Proporciona la misma interfaz que el paquetetext/template
y debe usarse en lugar detext/template
siempre que la salida sea HTML.El uso de los
template
paquetes básicamente requiere que proporcione una plantilla estática en forma de unstring
valor (que puede ser originario de un archivo en cuyo caso solo proporciona el nombre del archivo) que puede contener texto estático y acciones que se procesan y ejecutan cuando el El motor procesa la plantilla y genera la salida.Puede proporcionar parámetros que se incluyen / sustituyen en la plantilla estática y que pueden controlar el proceso de generación de salida. La forma típica de tales parámetros son
struct
symap
valores que pueden estar anidados.Ejemplo:
Por ejemplo, supongamos que desea generar mensajes de correo electrónico que se vean así:
Para generar cuerpos de mensajes de correo electrónico como este, puede usar la siguiente plantilla estática:
Y proporcione datos como este para ejecutarlo:
Normalmente, la salida de las plantillas se escribe en un
io.Writer
, así que si desea el resultado como astring
, cree y escriba en unbytes.Buffer
(que implementaio.Writer
). Ejecutando la plantilla y obteniendo el resultado comostring
:Esto dará como resultado el resultado esperado:
Pruébalo en Go Playground .
También tenga en cuenta que, dado Go 1.10, una alternativa más nuevo, más rápido, más especializado está disponible para los
bytes.Buffer
que es:strings.Builder
. El uso es muy similar:Prueba este en Go Playground .
Nota: también puede mostrar el resultado de una ejecución de plantilla si proporciona
os.Stdout
como destino (que también implementaio.Writer
):Esto escribirá el resultado directamente en
os.Stdout
. Prueba esto en Go Playground .fuente
En su caso, debe usar Sprintf () para formatear la cadena.
func Sprintf(format string, a ...interface{}) string
Sprintf formatea de acuerdo con un especificador de formato y devuelve la cadena resultante.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Su salida será:
fuente
La función fmt.SprintF devuelve una cadena y puede formatear la cadena de la misma manera que lo haría con fmt.PrintF
fuente
Podemos personalizar un nuevo tipo de cadena a través
define new Type
deFormat
soporte.fuente