一、字符串

1.1 字符串

  • Go 语言里的字符串的内部实现使用 UTF-8 编码。

  • 字符串的值为双引号(")中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符

s1 := "hello" 
s2 := "你好"

1.2 多行字符串

  • 反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出

package main

import (
  "fmt"
)

func main() {
  s1 := ` 
  第一行 
  第二行 
  第三行`
  fmt.Println(s1)
}

1.3 byte和rune

  • Go 语言的字符有以下两种

uint8类型,或者叫 byte 型:代表了ASCII码的一个字符。 
rune类型:代表一个 UTF-8字符
  • 字符串底层是一个byte数组,所以可以和[]byte类型相互转换。

  • 字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。

  • rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

package main

import "fmt"

func main() {
  // “美国第一”
  s := "美国第一"
  s_rune := []rune(s)
  fmt.Println("中国" + string(s_rune[2:])) // 中国第一 }
}

二、字符串的常用操作

方法

注释

Contains

是否包含指定的内容,返回布尔值

ContainsAny

是否包含指定的任意一个内容,有一个即可,返回布尔值

Count

统计指定内容 在字符串中出现的次数

HasPrefix

以xx开头

HasSuffix

以xx结尾

Index

寻找指定字符串第一次出现的位置,找到返回下标,找不到返回 -1

IndexAny

寻找指定字符串任意字符第一次出现的位置,找到返回下表,找不到返回-1

LastIndex

寻找指定字符串最后一次出现的位置,找到返回下表,找不到返回 -1

Join

用指定符号进行字符串凭借

Split

按照指定符号分割字符

Repeat

重复拼接自己

Replace

替换指定字符,n代表替换个数,-1替换全部

ToUpper

字母转大写

ToLower

字母转小写

str[start,end]

截取字符串

判断字符串长度len(str)

package main

import (
  "fmt"
)

func main() {
  var str = "this is str"
  fmt.Println(len(str)) // 11 
}

拼接字符串+

package main

import (
  "fmt"
)

func main() {
  var str1 = "你好"
  var str2 = "golang"
  fmt.Println(str1 + str2) // 你好golang
}

分割成切片strings.Split()

package main

import (
  "fmt"
  "strings"
)

func main() {
  var s = "123-456-789"
  var arr = strings.Split(s, "-")
  fmt.Println(arr) // [123 456 789]
}

组合字符串strings.Join()

package main

import (
  "fmt"
  "strings"
)

func main() {
  var str = "123-456-789"
  var arr = strings.Split(str, "-") // [123 456 789]
  var str2 = strings.Join(arr, "*") // 123*456*789
  fmt.Println(arr)
  fmt.Println(str2)
}

单引号

  • 组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符,字符用单引号(’)

  • uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符

  • rune 类型,代表一个 UTF-8 字符

package main

import "fmt"

func main() {
  a := 'a'
  name := "zhangsan"     //当我们直接输出 byte(字符)的时候输出的是这个字符对应的码值
  fmt.Println(a)         // 97 这里输出的是 a 字符串的 ASCII值
  fmt.Println(name)      // zhangsan 如果我们要输出这个字符,需要格式化输出
  fmt.Printf("的值是%c", a) // a的值是a
}

三、字符串遍历

遍历字符串

package main

import "fmt"

func main() {
  s := "hello 张三"
  for i := 0; i < len(s); i++ { //byte
    fmt.Printf("%v(%c) ", s[i], s[i]) // 104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 229(å) 188(¼) 160() 228(ä) 184(¸) 137()
    fmt.Println()                     // 打印一个换行
    for _, r := range s {             //rune
      fmt.Printf("%v=>%c ", r, r) // 104=>h 101=>e 108=>l 108=>l 111=>o 32=> 24352=>张 19977=>三
      fmt.Println()
    }
  }
}

修改字符串

  • 要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string。

  • 无论哪种转换,都会重新分配内存,并复制字节数组。

  • 将“美国第一”改成“中国第一”

package main

import "fmt"

func main() { // “美国第一”
  s := "美国第一"
  s_rune := []rune(s)
  fmt.Println("中国" + string(s_rune[2:])) // 中国第一
}

四、String转换

package main

import (
  "fmt"
  "strconv"
)

func main() {
  //1、int 转换成 string
  var num1 int = 20
  s1 := strconv.Itoa(num1)
  fmt.Printf("类型: %T ,值=%v \n", s1, s1) // 类型: string ,值=20 // 2、float 转 string
  var num2 float64 = 20.113123
  /*
    参数 1:要转换的值
    参数 2:格式化类型
    参数 3: 保留的小数点 -1(不对小数点格式化)
    参数 4:格式化的类型
  */
  s2 := strconv.FormatFloat(num2, 'f', 2, 64)
  fmt.Printf("类型: %T ,值=%v \n", s2, s2) // 类型: string ,值=20.11
  // 3、bool 转 string
  s3 := strconv.FormatBool(true)
  fmt.Printf("类型: %T ,值=%v \n", s3, s3) // 类型: string ,值=20.11
  // 4、int64 转 string
  var num3 int64 = 20
  s4 := strconv.FormatInt(num3, 10)  /* 第二个参数10为 进制 */
  fmt.Printf("类型 %T ,值=%v \n", s4, s4) // 类型 string ,值=20 
}

五、string与int转换

package main

import (
  "fmt"
  "strconv"
)

func main() {
  num := 100
  strNum := strconv.Itoa(num)
  fmt.Printf("num: %T %v \n", num, num)
  fmt.Printf("strNum: %T %v \n", strNum, strNum)
  intNum, _ := strconv.Atoi(strNum)
  fmt.Printf("intNum: %T %v \n", intNum, intNum)
}

/*
num: int 100
strNum: string 100
intNum: int 100
*/