Home  >  Article  >  Backend Development  >  Golang bytes and strings

Golang bytes and strings

WBOY
WBOYforward
2024-02-09 09:00:29890browse

Golang 字节与字符串

php editor Youzi will take you to explore in-depth bytes and strings in Golang. In Golang, bytes and string are common data types, but there are some subtle differences and conversion methods between them. Understanding these differences and conversion methods will help you better process your data and optimize program performance. This article will introduce the concepts of bytes and strings, methods of mutual conversion, and their usage scenarios in practical applications, helping you better understand and apply bytes and strings in Golang. Let’s explore together!

Question content

I am trying to find the common elements between two strings of equal length in golang.

The element is found, but the string representation appears to contain byte values ​​as well. How can I get rid of it?

func main() {
    println(fmt.printf("common element = %s",
        findcommonelement("abcdefghi", "ijklmnopq")))
}

func findcommonelement(firstelements, secondelements string) string {
    elementsinfirstgroup := make(map[string]bool)
    for _, charvalue := range firstelements {
        elementsinfirstgroup[string(charvalue)] = true
    }
    for index := range firstelements {
        if _, ok := elementsinfirstgroup[string(secondelements[index])]; ok {
            matchingelem := secondelements[index]
            println(string(matchingelem))
            return string(matchingelem)
        }
    }

    panicmessage := fmt.sprintf("could not find a common item between %s and %s", firstelements, secondelements)
    panic(panicmessage)
}

The output I get is

i
common element = i18 (0x0,0x0)

Code provided here

Workaround

You should use fmt.sprintf instead of fmt.printf .

And avoid using the built-in println, instead use fmt.println.

https://pkg.go.dev/[email protected]#printf

func printf(format string, a ...any) (n int, err error)

printf formats according to the format specifier and writes to standard output. It returns the number of bytes written and any write errors encountered.

Therefore 18 (0x0,0x0)...

  • 18 is the number of characters in the string "common element = i".
  • (0x0,0x0) is the nil error value printed by println.

More importantly, however, your algorithm is flawed because it mixes bytes with runes. When you range a string, the iteration variable charvalue will be assigned a rune, which may be multibyte. However, when you index a string (e.g. secondelements[index]), the result is always a single byte. Therefore, panics or gibberish (invalid bytes) will inevitably be the result of your function. See Examples.

You may get better results by doing the following:

func findCommonElement(firstElements, secondElements string) string {
    second := map[rune]bool{}
    for _, r := range secondElements {
        second[r] = true
    }

    for _, r := range firstElements {
        if second[r] {
            fmt.Println(string(r))
            return string(r)
        }
    }

    panic("...")
}

https://www.php.cn/link/dbdc69ea6ccbdea0ca2d796e1af24ebf

The above is the detailed content of Golang bytes and strings. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete