2017-12-06 4 views
-1

Um halb-zufällige Nacktschnecken zu machen, möchte ich die ersten 8 Zeichen von Uuid verwenden. So habe ichWie schneidet man UUID in Golang?

import (
    fmt 
    "github.com/satori/go.uuid" 
) 

    u1 := uuid.NewV4() 
    fmt.Println("u1 :", u1) 

    runes := []rune(u1) 
    slug := string(runes[0:7]) 

Aber in der Kompilierung bekomme ich diesen Fehler:

cannot convert u1 (type uuid.UUID) to type []rune

Wie kann ich es beheben?

+1

Warum versuchen Sie, es in '[] Rune' zu ​​konvertieren? Eine UUID kann nur Hexadezimalzeichen in ihrer Zeichenfolgendarstellung enthalten. Warum nicht einfach die 'String()' Methode benutzen? – JimB

+0

@ JimB, ich bin ein Go Noob und das ist ein Schnipsel, den ich gefunden habe, um die Zeichenfolge auf bestimmte Länge zu schneiden. Schätzen Sie eine vollständige Antwort mit Codebeispiel. – Karlom

+1

sollten Sie mit der grundlegenden Dokumentation beginnen, vielleicht durch die [Tour of Go] (https://tour.golang.org). Cutting & Paste ohne zu wissen, warum selten gut endet. – JimB

Antwort

3

In diesem Paket eine UUID ist ein Alias ​​für [16]byte (I auf den Quellcode nur sah), so kann man auf eine Rune Array nicht Konzert es, nicht, dass Sie wollen.

Try this:

s := hex.EncodeToString(u1.Bytes()[:4]) 

Dies wird Ihnen 8 hexadezimalen Ziffern geben. Dies ist jedoch immer noch ein Umweg. Eine v4-UUID ist mit Ausnahme bestimmter Bits zufällig. Wenn Sie also nicht die gesamte UUID verwenden, ist es einfacher, nur 4 zufällige Bytes zu generieren. Verwenden Sie die Read()-Funktion in math/rand (die gesetzt werden muss) oder crypto/rand (was die UUID-Bibliothek verwendet).

b := make([]byte, 4) 
rand.Read(b) // Doesn’t actually fail 
s := hex.EncodeToString(b) 
+0

Was glauben Sie, ergibt mehr zufällige Ergebnisse? 'hex.EncodeToString (u1.Bytes() [: 4])' oder 'make ([] Byte, 4)'? – Karlom

+0

@Karlom: 'make ([] Byte, 4)' ist nicht zufällig, Sie müssen zufällige Daten hineinlegen. – JimB

+2

Sie sind beide gleichmäßig zufällig. Mit UUIDs generieren Sie jedoch zusätzliche zufällige Bits, sodass Sie sie wegwerfen können. Warum sollten Sie sich mit UUIDs beschäftigen, nur um sie wegzuwerfen? –

4

Die UUID muss nicht in eine []rune konvertiert werden. Dieser UUID Typ wird in einer binären Darstellung als [16]byte gespeichert. Es gibt eine UUID.String() Methode, die Sie verwenden können, um in eine Zeichenfolge zu konvertieren und sie dann zu zerschneiden.

slug := u1.String()[:7] 
+0

Beachten Sie, dass dies Bindestriche enthält, wenn Sie mehr als 8 Zeichen benötigen. –

+0

@DietrichEpp: True, aber da sie eine UUID, die das String-Format Teil der Spezifikation ist, speziell geschnitten wurden, nahm ich an, dass dies beabsichtigt war. Warum sollte man sonst eine UUID verwenden? – JimB

+0

@DietrichEpp, oh ich sehe, sie wollten es nur für "Zufälligkeit" – JimB