instalar - Desembalar rebanadas de Golang en la asignación?
instalar go en linux (2)
Como mencionó Sergio Tulentsev, no se admite el empaque / desempaque general como se hace en Python. Creo que el camino a seguir es definir su propia función ad hoc pequeña utilizando múltiples valores de retorno:
func splitLink(s, sep string) (string, string) {
x := strings.Split(s, sep)
return x[0], x[1]
}
Y luego puedes escribir:
name, link := splitLink("foo/thttps://bar", "/t")
Pero esto obviamente funcionará solo cuando se dividan al menos dos subcadenas, y se ignorará silenciosamente si hubiera más de dos. Si esto es algo que usas mucho, podría hacer que tu código sea más legible.
--EDITAR--
Otra forma de descomprimir una matriz es a través de varios argumentos de puntero:
func unpack(s []string, vars... *string) {
for i, str := range s {
*vars[i] = str
}
}
Que te deja escribir:
var name, link string
unpack(strings.Split("foo/thttps://bar", "/t"), &name, &link)
bookmarks[name] = link
Esto funcionará para cualquier tamaño de matriz, pero puede decirse que es menos legible, y tiene que declarar sus variables explícitamente.
¿Existe una forma elegante en Golang para realizar múltiples tareas desde matrices como en Python? Aquí hay un ejemplo de Python de lo que estoy tratando de hacer (dividir una cadena y luego asignar la matriz resultante en dos variables).
python:
>>> a, b = "foo;bar".split(";")
Mi solución actual es:
x := strings.Split("foo;bar", ";")
a, b := x[0], x[1]
Puedo ver que esto se ensucia en algunas construcciones. El ejemplo práctico que estoy enfrentando actualmente es un archivo de marcadores que analiza y asigna a un mapa:
bookmark := make(map[string]string)
x := strings.Split("foo/thttps://bar", "/t")
name, link := x[0], x[1]
bookmark[name] = link
Ahora tengo una variable inútil "x" sentada. Me gustaría hacer algo como:
bookmark := make(map[string]string)
name, line := strings.Split("foo/thttps://bar", "/t")
bookmark[name] = link
pero eso es inválido
Si su función está destinada a dividir una cadena solo por la primera aparición del separador, siempre puede crear su propia función:
package main
import (
"fmt"
"strings"
)
func Split(s, sep string) (string, string) {
// Empty string should just return empty
if len(s) == 0 {
return s, s
}
slice := strings.SplitN(s, sep, 2)
// Incase no separator was present
if len(slice) == 1 {
return slice[0], ""
}
return slice[0], slice[1]
}
func main() {
a, b := Split("foo;bar;foo", ";")
fmt.Println(a, b)
}
Salida:
foo bar; foo