Я использую приведенный ниже фрагмент сценария, значение «var1» возвращает 7d470821-a66a-5d57-b54f-2784ca96c591
, теперь значение, присвоенное «var1», я хочу удалить «-», чтобы оно стало 7d470821a66a5d57b54f2784ca96c591
. Я пытаюсь ниже script
package main
import (
"fmt"
"strings"
"github.com/google/uuid"
)
var namespace = uuid.NameSpaceURL
var value = "abc" + "hello world" + "bow"
var urls1 = []byte(value)
func main() {
fmt.Println("Generating UUIDs\n----------------")
generate()
}
func generate() {
//u, _ := uuid.NewUUID()
//fmt.Println("UUID version 1:", u)
var1 := uuid.NewSHA1(namespace, urls1)
fmt.Println(var1 )
var2 = strings.Replace(var1, "-","",0)
fmt.Println(var2)
}
и я получаю, пожалуйста, помогите мне исправить то, что я ошибаюсь.
./test-uuid1.go:23:29: cannot use var1 (variable of type uuid.UUID) as string value in argument to strings.Replace
strings.Replace() ожидает string
, а uuid.NewSHA1() возвращает значение типа uuid.UUID.
Вызовите его метод UUID.String(), чтобы получить представление string
.
Также обратите внимание, что при передаче 0
в strings.Replace()
будет выполнено 0 замен, поэтому ничего не изменится. Не слишком полезно. Передайте -1
, чтобы указать, что вы хотите заменить все вхождения -
, или, что еще лучше, используйте strings.ReplaceAll():
var2 := strings.ReplaceAll(var1.String(), "-", "")
(Примечание var2
не существует, поэтому вы должны использовать :=
короткое объявление переменной вместо простого присваивания.)
Это выведет (попробуйте на Go Playground):
Generating UUIDs
----------------
7d470821-a66a-5d57-b54f-2784ca96c591
7d470821a66a5d57b54f2784ca96c591
NewSHA1 возвращает новый UUID SHA1 (версия 5).
var1 — это тип UUID (то есть: тип UUID [16] byte), а не тип String, первый параметр strings.Replace() — это тип String.
Итак, вам нужно преобразовать тип var1 в String: var1.String()
var2 = strings.Replace(var1.String(), "-","",0)
Ниже приведен исходный код "github.com/google/uuid":
// NewSHA1 returns a new SHA1 (Version 5) UUID based on the
// supplied name space and data. It is the same as calling:
//
// NewHash(sha1.New(), space, data, 5)
func NewSHA1(space UUID, data []byte) UUID {
return NewHash(sha1.New(), space, data, 5)
}
Ответ icza и решение верны, они были приняты и в настоящее время имеют пять голосов. Частично,
var1 := uuid.NewSHA1(namespace, urls1)
var2 := strings.ReplaceAll(var1.String(), "-", "")
Однако, если вам задают этот вопрос как вопрос для собеседования по Go, вы можете предпочесть:
func UUID5Hex(space uuid.UUID, data []byte) string {
uuid := uuid.NewSHA1(space, data)
return hex.EncodeToString(uuid[:])
}
uuid := UUID5Hex(namespace, urls1))
https://go.dev/play/p/GJwKZKDTSvp
abchello worldbow
7d470821a66a5d57b54f2784ca96c591
Интервьюер может ожидать, что вы примените бритву Оккама. Форматирование UUID в виде шестнадцатеричной строки с дефисами и последующее удаление дефисов не является экономным.
Некоторые результаты тестов Go:
BenchmarkUUID5Hex-12 3371100 337.4 ns/op 216 B/op 5 allocs/op
BenchmarkUUIDIcza-12 2845947 444.5 ns/op 232 B/op 5 allocs/op
Ошибка говорит обо всем.
strings.Replace()
принимает строку в качестве первого аргумента, и вы передаете UUID. Вы должны преобразоватьvar1
в строку, если хотите использовать этот метод. Для этого вам нужно изменитьvar1
наvar1.String()
.