1.字符串的组成?
Golang的字符串都是由单个字节连接起来的,每个字节都是UTF8编码标识的Unicode文本。(不需要在考虑中文不兼容问题)

2.如何遍历字符串?
先看一个例子:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123"
  9. for i := 0; i < len(str); i++ {
  10. fmt.Println(str[i])
  11. }
  12. }

  

输出:

  1. 49
  2. 50
  3. 51

和想象中不太一样,接着看下面。

遍历有两种方式:

  • for i:=0;i<len;i++{}
  • for k,v:=range string {}

区别在于第一种遍历的事ASCII字符,第二种是Unicode字符,当遇到汉字的时候第一种就会乱码了。这也就解释了前文为啥不是输出123了,需要格式化ASCII码才是我们想看到的。

第一种

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123世界!"
  9. for i := 0; i < len(str); i++ {
  10. fmt.Printf("%c\n", str[i])
  11. }
  12. }

  

输出:

  1. 1
  2. 2
  3. 3
  4. ä
  5. ¸
  6. –
  7. ç
  8. •
  9. Œ
  10. ï
  11. ¼

这里乱码原因需要解释下:
在遍历的时候,ASCII字符只需要一个字节,而非ASCII 字符的可能需要2或者3、4个字节不固定,所以碰到非ASCII 字符的用str[i]来获取一个字节,获取的不全,肯定就乱码了。

有什么办法解决乱码呢?
那就是转为rune类型的切片就好了

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123世界!"
  9. strRune := []rune(str)
  10. for _, v := range strRune {
  11. fmt.Printf("%c\n", v)
  12. }
  13. }

  输出:

  1. 1
  2. 2
  3. 3


因为在Golang中字符类型实际存储使用rune的。

第二种 range

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123世界!"
  9. for _, v := range str {
  10. fmt.Printf("%c\n", v)
  11. }
  12. } 

 输出:

  1. 1
  2. 2
  3. 3


3.如何将字符串与整型互转?
转换 表达

  1. import "strconv"
    Atoi : i, err := strconv.Atoi("8888")
    Itoa: s := strconv.Itoa(333)
  2. Format xxx 转成string字符串
  • FormatBool: func FormatBool(b bool) string
  • FormatFloat: func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  • FormatInt: func FormatInt(i int64, base int) string
  • FormatUint: func FormatUint(i uint64, base int) string

FormatInt()和FormatUint()有两个参数:第二个参数base指定将第一个参数转换为多少进制,有效值为2<=base<=36。当指定的进制位大于10的时候,超出10的数值以a-z字母表示。例如16进制时,10-15的数字分别使用a-f表示,17进制时,10-16的数值分别使用a-g表示。

例如:FormatInt(-42, 16)表示将-42转换为16进制数,转换的结果为-2a。

FormatFloat()参数众多:

bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。

fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。

prec控制精度(排除指数部分):对'f'、'e'、'E',它表示小数点后的数字个数;对'g'、'G',它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。

eg:

  1. s := strconv.FormatBool(true)
  2. s := strconv.FormatFloat(3.1415, 'E', -1, 64)
  3. s := strconv.FormatInt(-42, 16)
  4. s := strconv.FormatUint(42, 16)
  5. Parse类函数用于转换字符串为给定类型的值ParseBool()、ParseFloat()、ParseInt()、ParseUint()。
    eg:
  1. b, err := strconv.ParseBool("true")
  2. f, err := strconv.ParseFloat("3.1415", 64)
  3. i, err := strconv.ParseInt("-42", 10, 64)
  4. u, err := strconv.ParseUint("42", 10, 64)
  1.  

 

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strconv"
  6. )
  7.  
  8. func main() {
  9. var str = "123世界!"
  10. for _, v := range str {
  11. fmt.Printf("%c\n", v)
  12. }
  13.  
  14. s := strconv.FormatBool(true)
  15. fmt.Println(s)
  16. s = strconv.FormatFloat(3.1415, 'E', -1, 64)
  17. fmt.Println(s)
  18. s = strconv.FormatInt(-42, 16)
  19. fmt.Println(s)
  20. s = strconv.FormatUint(42, 8)
  21. fmt.Println(s)
  22. }

  输出:

  1. 1
  2. 2
  3. 3



  4. true
  5. 3.1415E+00
  6. -2a
  7. 52

  

4.如何改变其中某个字符?
根据前文我们知道字符有两种,一种是ASCII,一种是Unicode。
所以需要根据不同的字节数来替换。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123世界!"
  9. for _, v := range str {
  10. fmt.Printf("%c\n", v)
  11. }
  12.  
  13. bytes := []byte(str)
  14. bytes[1] = 'a'
  15. str = string(bytes)
  16. fmt.Println(str)
  17. }

输出:

  1. 1
  2. 2
  3. 3



  4. 1a3世界!

  

如果是想兼容汉字那么使用rune:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. var str = "123世界!"
  9. for _, v := range str {
  10. fmt.Printf("%c\n", v)
  11. }
  12. runes := []rune(str)
  13. runes[4] = 'a'
  14. str = string(runes)
  15. fmt.Println(str)
  16. }

  

输出:

  1. 1
  2. 2
  3. 3



  4. 123a

  

5.如何截取字符串?
substr := str[n:m] 左开右闭

6.如何计算长度?

若全为ASCII字符,则len(str)。
若存在非ASCII的Unicode字符,则utf8.RuneCountInString(str)。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "unicode/utf8"
  6. )
  7.  
  8. func main() {
  9. var str = "123世界!"
  10. fmt.Println(utf8.RuneCountInString(str))
  11. }

  输出:

6

7.如何连接字符串?
提供三种方式:

第一种(最简单):使用+

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8.  
  9. str1 := "123"
  10. str2 := "世界!"
  11. fmt.Println(str1 + str2)
  12.  
  13. }

输出:

123世界!

第二种(最高效):使用字节拼接

  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "fmt"
  6. )
  7.  
  8. func main() {
  9.  
  10. str1 := "123"
  11. str2 := "世界!"
  12. var buf bytes.Buffer
  13. buf.WriteString(str1)
  14. buf.WriteString(str2)
  15. fmt.Println(buf.String())
  16.  
  17. }

输出:

123世界!

第三种:使用系统包

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7.  
  8. func main() {
  9.  
  10. str1 := "123"
  11. str2 := "世界!"
  12. str := strings.Join([]string{str1, str2}, "")
  13. fmt.Println(str)
  14.  
  15. }

三种连接方式性能测试

文件:study_test.go

  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "strings"
  6. "testing"
  7. )
  8.  
  9. func StrPlus1(a []string) string {
  10. var s, sep string
  11. for i := 0; i < len(a); i++ {
  12. s += sep + a[i]
  13. sep = " "
  14. }
  15. return s
  16. }
  17.  
  18. func StrPlus2(a []string) string {
  19. return strings.Join(a, " ")
  20. }
  21.  
  22. func StrPlus3(a []string) string {
  23.  
  24. var buf bytes.Buffer
  25. var sep = " "
  26. for i := 0; i < len(a); i++ {
  27. buf.WriteString(a[i])
  28. buf.WriteString(sep)
  29.  
  30. }
  31. return buf.String()
  32. }
  33.  
  34. func BenchmarkStrPlus1(b *testing.B) {
  35. for i := 0; i < b.N; i++ {
  36. StrPlus1([]string{"xxx", "bbb", "aaa"})
  37. }
  38. }
  39.  
  40. func BenchmarkStrPlus2(b *testing.B) {
  41. for i := 0; i < b.N; i++ {
  42. StrPlus2([]string{"xxx", "bbb", "aaa"})
  43. }
  44. }
  45.  
  46. func BenchmarkStrPlus3(b *testing.B) {
  47. for i := 0; i < b.N; i++ {
  48. StrPlus3([]string{"xxx", "bbb", "aaa"})
  49. }
  50. }

运行压力测试go test -test.bench=".*"

输出:

golang学习笔记---string && strconv的更多相关文章

  1. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  2. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  3. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  4. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  5. golang学习笔记7 使用beego swagger 实现API自动化文档

    golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...

  6. golang学习笔记5 用bee工具创建项目 bee工具简介

    golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...

  7. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  8. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  9. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

随机推荐

  1. ZKEACMS 无法运行问题汇总

    前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...

  2. linux 中断底半部机制对比(任务队列,工作队列,软中断)--由linux RS485引出的血案【转】

    转自:http://blog.chinaunix.net/uid-20768928-id-5077401.html 在LINUX RS485的使用过程中,由于各种原因,最后不得不使用中断底半部机制的方 ...

  3. 5.2 RDD编程---键值对RDD

    一.键值对RDD的创建 1.从文件中加载 2.通过并行集合(数组)创建RDD 二.常用的键值对RDD转换操作 1.reduceByKey(func) 功能:使用func函数合并具有相同键的值 2.gr ...

  4. luoguP1198 [JSOI2008]最大数

    https://www.luogu.org/problem/P1198 update!!! 经过老师的讲解,惊人的发现这题有用更简单数据结构维护的解法,而越简单的数据结构(如果能够用的话),越好(实现 ...

  5. C++ 函数重载、函数模板,类模板

    1.函数重载 相同作用域下,有多个函数名相同,但形参列表不同的函数,常用于处理功能相同但数据类型不同的问题 函数重载的规则: 函数名必须相同 函数形参列表必须不同(可以是参数个数不同,或者数据类型不同 ...

  6. day36_8_20数据库3外键

    一.一对多 在数据库使用数据中经常遇到一对多的情况,以公司员工为例. 一张完整的员工表有以下字段: id  name  gender  dep_name  dep_desc . 以此建表得: id n ...

  7. Azure产品整理

    Azure的文档真是够落地,简明易懂. 计算 Linux 虚拟机:为 Ubuntu.Red Hat 等预配虚拟机 Windows 虚拟机 为 SQL Server.SharePoint 等预配虚拟机 ...

  8. TCP的三次握手和四次挥手详解

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP报文格式 TCP的包如下: ...

  9. Excel-信息函数&数组公式

    1.IS系列函数-逻辑函数 is函数是一个逻辑函数,可以用来判断一些特定的内容 Istext判断单元格是否是文本 Isnumber判断单元格是否为数值 Istext和isnumber的判断的结果相反 ...

  10. [LeetCode] 658. Find K Closest Elements 寻找K个最近元素

    Given a sorted array, two integers k and x, find the k closest elements to x in the array. The resul ...