Go lang заменить символ в значении

Я использую приведенный ниже фрагмент сценария, значение «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() принимает строку в качестве первого аргумента, и вы передаете UUID. Вы должны преобразовать var1 в строку, если хотите использовать этот метод. Для этого вам нужно изменить var1 на var1.String().

Mattia Righetti 20.02.2023 11:49
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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)
}

маршрут: https://github.com/google/uuid/blob/master/hash.go

Ответ 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

Другие вопросы по теме