【Golang】byte与rune的区别,以及如何转String

Golang中byte与rune

byte=uint8,rune=uint32(记住rune能表示更多的范围,比如中文(go中占3个字符))

package main

import "fmt"

func main(){
     
	str1:="hello,world"
	a:=[]byte(str1)
	b:=[]uint8(str1)
	//byte==uint8
	fmt.Println("a:",a)//a: [104 101 108 108 111 44 119 111 114 108 100]
	fmt.Println("b:",b)//b: [104 101 108 108 111 44 119 111 114 108 100]
	//rune==uint32
	//记住一点rune能表示的范围更多,比如中文(一个中文占3个字符)等
	str2:="你好,中国"
	c:=[]rune(str2)
	d:=[]byte(str2)
	fmt.Println("c:",c)//c: [20320 22909 44 20013 22269]  中文字符也能拆
	fmt.Println("d:",d)//d: [228 189 160 229 165 189 44 228 184 173 229 155 189]  一个中文拆成3个字符表示4*3+1=13
}

golang中自带的string函数

这个函数接收切片类型的参数,上面的代码片段打印都是int,我们可以换成string进行打印,即

	str2:="你好,中国"
	c:=[]rune(str2)
	d:=[]byte(str2)
	fmt.Println("c:",string(c))//c: 你好,中国
	fmt.Println("d:",string(d))//d: 你好,中国

力扣(893)特殊等价字符串组,遇到的一个特殊场景

题目:【Golang】byte与rune的区别,以及如何转String_第1张图片

func numSpecialEquivGroups(A []string) int {
     
	m := make(map[string]bool)
	for _, v := range A {
     
		count := make([]rune, 52)
		for k1, v1 := range v {
     
			count[int(v1-'a')+26*(k1&1)]++
		}
		//fmt.Println(count)
		key := string(count)
		//fmt.Println(key)
		m[key] = true
	}
	return len(m)
}

这题是简单题,但是我觉得并不简单,主要是思路并不能一下就想到。
思路:开辟一个52个空间的切片(至于是什么类型的切片,后面再讨论),偶数放前面,奇数+26放后面,然后放入map中,相同的就对value++,不同的就开辟一个新key放入,最后放回len就是题目要的分解个数了。

为什么这里要用[]rune切片?

如果用byte切片,你是没办法直接对他进行++操作的,因为他默认是字符类型,你是没办法直接对字符类型进行++操作的,而rune则可以,还记得前面说的rune能表示的范围更广吗?正因为如此,我可以直接对他进行++操作。之后对切片直接转string就可以当做key了,这里是不是很神奇?

可能是我太菜了。

如果什么都很容易,那还要选择做什么?

你可能感兴趣的:(go,golang,字符串)