Go scheint mir der nächste große Hype nach Node.js zu sein, und Node hat mich ziemlich enttäuscht von der Performance her und dem generellen Design nachdem die erste Faszination vorbei ist.
Go hingegen wird von Google entwickelt (es stehlt also genug Manpower dahinter) und schreibt sich so lässig wie C, nur eben ohne die memory management-Fickerei. (Auch wenn das natürlich für einige der wahre Spaß am Programmieren ist
)
Ich rechne ehrlich gesagt nicht damit, dass Go clientside eine große Zukunft (für Malware) hat, gerade weil systemnahes arbeiten zwar möglich ist, aber eher kompliziert.
Für Backends (auch für Malware) würde ich Go allerdings durchaus im Kommen sehen.
Letztlich ist das Beispiel vielleicht auch nicht so glücklich. Die Multiplex-Library macht natürlich das Tunneln extrem einfach, ist aber schlecht in andere Sprachen konvertierbar, gerade weil es für hierfür auch keinen Standard gibt.
Ich habe auch noch eine andere Implementation, die anstelle des Connection Multiplexing einen eigenen Control-Socket verwendet und dann über ein simples Textprotokoll mit IDs die Connection anfordert, worauf der Client dann eine neue Verbindung aufbaut und die jeweilige Id zuerst schickt.
Bei einer neuen Socks-Anfrage sendet der Server dann sowas über den Controlsocket (Id hat feste Länge)
Code:
c.Send("TUNN" + id + addr + "\n")
Und wenn der Verbindungsaufbau beim Client erfolgreich war, erstellt er eine neue Connection zum Server, sendet die ID zuerst und dann wird eben getunnelt.
Code:
message = strings.TrimSpace(message) if message[:4] == "TUNN" {
id := message[4:10]
log.Println(id)
target := message[10:len(message)]
log.Println(target)
go establishTunnel(target, id)
}
Das hat natürlich mehr Overhead, ist fehleranfälliger und generell weniger elegant, aber es wäre natürlich beträchtlich einfacher in andere Sprachen für den Client zu portieren, sodass Go bei seiner eigentlichen Stärke, den Servern bleiben kann.