公众号merlinsea
for循环遍历特点
- for-len()遍历不带中文的字符传是没有问题的【正确】
var str string = "hello,world!" for i := 0; i < len(str); i++ { fmt.Printf("%c \t", str[i]) //使用到下标... }
- for-len()遍历带中文的字符串会出现乱码【错误】
- 因为for-len()遍历在golang语言中是按照一个字节一个字节来取的,而一个汉字在utf8编码中是占3个字节的,所以不能用下面这个方法遍历带中文的字符串。
var str string = "hello,world!北京" for i := 0; i < len(str); i++ { // 会出现乱码 fmt.Printf("%c \t", str[i]) //使用到下标... }
- for-len()遍历带中文的字符串要先进行强转为[]rune切片后再遍历【正确】
var str string = "hello,world!北京" str2 := []rune(str) // 就是把 str 转成 []rune for i := 0; i < len(str2); i++ { fmt.Printf("%c \t", str2[i]) //使用到下标... }
- for-range遍历,既可以遍历带中文的字符串,也可以遍历不带中文的字符串【正确】
- for-range是按照字符的方式来遍历的
str = "abc~ok上海" for index, val := range str { fmt.Printf("index=%d, val=%c,val type = %T ,str[i] type = %T \n", index, val, val, str[index]) }
string和基本数据类型的相互转换
- 基本数据类型转string
- 思路1:fmt.Sprintf()
var num1 int = 99 var num2 float64 = 23.456 var b bool = true var myChar byte = 'h' var str string //空的str //使用第一种方式来转换 fmt.Sprintf方法 str = fmt.Sprintf("%d", num1) fmt.Printf("str type %T str=%q\n", str, str) str = fmt.Sprintf("%f", num2) fmt.Printf("str type %T str=%q\n", str, str) str = fmt.Sprintf("%t", b) fmt.Printf("str type %T str=%q\n", str, str) str = fmt.Sprintf("%c", myChar) fmt.Printf("str type %T str=%q\n", str, str)
思路2:使用strconv包下的Formatxxx()
//第二种方式 strconv 函数 var num3 int = 99 var num4 float64 = 23.456 var b2 bool = true str = strconv.FormatInt(int64(num3), 10) fmt.Printf("str type %T str=%q\n", str, str) // strconv.FormatFloat(num4, 'f', 10, 64) // 说明: 'f' 格式 10:表示小数位保留10位 64 :表示这个小数是float64 str = strconv.FormatFloat(num4, 'f', 10, 64) fmt.Printf("str type %T str=%q\n", str, str) str = strconv.FormatBool(b2) fmt.Printf("str type %T str=%q\n", str, str) //strconv包中有一个函数Itoa var num5 int64 = 4567 str = strconv.Itoa(int(num5)) fmt.Printf("str type %T str=%q\n", str, str)
- string转基本数据类型
- 思路:使用strconv包下的Parsexxx()
- 注意,这里ParseInt()的返回结果是int64类型,如果我们需要使用int类型,可以在用int64接受函数返回值以后进行单独类型转换。
//演示golang中string转成基本数据类型 func main() { var str string = "true" var b bool // b, _ = strconv.ParseBool(str) // 说明 // 1. strconv.ParseBool(str) 函数会返回两个值 (value bool, err error) // 2. 因为我只想获取到 value bool ,不想获取 err 所以我使用_忽略 b, _ = strconv.ParseBool(str) fmt.Printf("b type %T b=%v\n", b, b) var str2 string = "1234590" var n1 int64 var n2 int n1, _ = strconv.ParseInt(str2, 10, 64) n2 = int(n1) fmt.Printf("n1 type %T n1=%v\n", n1, n1) fmt.Printf("n2 type %T n2=%v\n", n2, n2) var str3 string = "123.456" var f1 float64 f1, _ = strconv.ParseFloat(str3, 64) fmt.Printf("f1 type %T f1=%v\n", f1, f1) //注意: var str4 string = "hello" var n3 int64 = 11 n3, err := strconv.ParseInt(str4, 10, 64) if err != nil { fmt.Printf("转化失败 err = %v\n", err.Error()) } else { fmt.Printf("n3 type %T n3=%v\n", n3, n3) } }