字符串

Go 语言里的字符串的内部实现使用 UTF-8 编码。
字符串的值为双引号(")中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符
s1 := "hello"
s2 := "你好"

字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等

package main

import (
    "fmt"
)

func main() {
    // 创建字符串
    fmt.Println("str := \"c:\\Code\\demo\\go.exe\"") // str := "c:\Code\demo\go.exe"
    str := "c:\\Code\\demo\\go.exe"
    fmt.Println("str := ", str)
}

多行字符串

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

package main

import (
    "fmt"
)

func main() {
    // 创建的多行字符串
    sManyLine := `第一行
第二行
第三行`
    fmt.Println(sManyLine)
}

byte和rune

Go 语言的字符有以下两种
uint8类型,或者叫 byte 型:代表了ASCII码的一个字符。
rune类型:代表一个 UTF-8字符
字符串底层是一个byte数组,所以可以和[]byte类型相互转换。
字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。
rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

package main

import (
    "fmt"
)

// byte和rune
func byteAndRune() {
    s := "日本垃垃"
    fmt.Println(s)
    sRune := []rune(s)
    fmt.Println("美国" + string(sRune[2:]))
}

func main() {
    byteAndRune()
}

字符串的常用操作

方法 介绍
len(str) 求长度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.Contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) join操作

len(str)

package main

import (
    "fmt"
)

// 获取字符串长度
func lenStr(a *string) {
    fmt.Println(len(*a))
}

func main() {
    var a = "string"
    lenStr(&a)

}

+(拼接)

package main

import (
    "fmt"
)

// 拼接字符串
func strJoin(a, b *string) {
    fmt.Println(*a + *b)
}

func main() {
    var a = "hi  "
    var b = "lao 8"
    strJoin(&a, &b)

}

strings.Split()

package main

import (
    "fmt"
    "strings"
)

// 切分字符串
func strSplit(a *string) {
    bArr := strings.Split(*a, "/")
    fmt.Println(bArr)
    fmt.Println(bArr[0])
}

func main() {
    a := "123/456/789"
    strSplit(&a)
}

strings.HasPrefix()

首字符尾字母包含指定字符

package main

import (
    "fmt"
    "strings"
)


func strHasPrefix(a *string) {
    // 是否以test开头
    if strings.HasPrefix(*a, "test") {
        fmt.Println("是test开头")
    } else if strings.HasSuffix(*a, "end") { //是否以en结尾
        fmt.Println("是end结尾")
    }
}

func main() {
    a := "test_a"
    strHasPrefix(&a)
    a = "a_end"
    strHasPrefix(&a)
}

strings.Index()

判断字符串出现的位置

package main

import (
    "fmt"
    "strings"
)

// 判断字符串出现的位置
func indexStr(a *string) {
    index := strings.Index(*a, "w")
    fmt.Println(index)
}

func main() {
    // 判断字符串出现的位置
    a := "teswt"
    indexStr(&a)
}

strings.Join()

package main

import (
    "fmt"
    "strings"
)

// 拼接字符串
func strJoin2(a *string) {
    aArr := strings.Split(*a, " ")
    fmt.Println(aArr)
    aStr := strings.Join(aArr, "-")
    fmt.Println(aStr)
}

func main() {
    var b = "lao 8"
    strJoin2(&b)
}

单引号

组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符,字符用单引号(’)
uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符
rune 类型,代表一个 UTF-8 字符

package main

import (
    "fmt"
    "strings"
)

func strASCII() {
    a := 'a'
    name := "张三"
    // 当我们直接输出 byte(字符)的时候输出的是这个字符对应的码
    fmt.Println(a) // 97 这里输出的是 a 字符串的 ASCII值
    fmt.Println(name)
    // 如果我们要输出这个字符,需要格式化输出
    fmt.Printf("%c\n", a)
    // 或者声明并强转为str
    var b = string('a')
    fmt.Println(b)
}

func main() {
    // 单引号
    strASCII()
}

遍历字符串

package main

import "fmt"

func main() {
    s := "hello word"
    // 通过下标去获取元素
    for i := 0; i < len(s); i++ {
        //%v 相应值的默认格式; %c 输出单个字符
        fmt.Printf("%v(%c)   ", s[i], s[i])
    }
    fmt.Println()
    // 遍历循环元素
    for _, j := range s {
        fmt.Printf("%v(%c)   ", j, j)
    }

}

修改字符串

要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string。
无论哪种转换,都会重新分配内存,并复制字节数组。

package main

import "fmt"

func main() {
    // 修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string
    s1 := "big"
    byteS1 := []byte(s1)
    byteS1[0] = 'B'
    fmt.Println(string(byteS1))

    s2 := "Big"
    byteS2 := []rune(s2)
    byteS2[0] = 'b'
    fmt.Println(string(byteS2))
}
package main

import "fmt"

func main() {
    // 修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string
    s1 := "big"
    byteS1 := []byte(s1)
    byteS1[0] = 'B'
    fmt.Println(string(byteS1))

    s2 := "Big"
    byteS2 := []rune(s2)
    byteS2[0] = 'b'
    fmt.Println(string(byteS2))
}

sprintf转string

注意:sprintf 使用中需要注意转换的格式
int 为%d
float 为%f
bool 为%t
byte 为%c

package main

import "fmt"

func main() {
    var i int = 10
    var f float64 = 2.00
    var t bool = true
    var b byte = 'a'
    var str string

    str = fmt.Sprintf("%d", i)
    fmt.Printf("类型: %T,值: %v \n", str, str)

    str = fmt.Sprintf("%f", f)
    fmt.Printf("类型: %T,值: %v \n", str, str)

    str = fmt.Sprintf("%t", t)
    fmt.Printf("类型: %T,值: %v \n", str, str)

    str = fmt.Sprintf("%c", b)
    fmt.Printf("类型: %T,值: %v \n", str, str)
}

strconv

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // int 转换为 string
    var i int
    fmt.Printf("转换前类型:%T,值:%v \n", i, i)
    s1 := strconv.Itoa(i)
    fmt.Printf("转换后类型:%T,值:%v \n", s1, s1)
    fmt.Println()

    // float 转 string
    var i2 float64 = 0.01
    fmt.Printf("转换前类型:%T,值:%v \n", i2, i2)
    /* 参数 1:要转换的值
    参数 2:格式化类型
    参数 3: 保留的小数点 -1(不对小数点格式化)
    参数 4:格式化的类型
    */
    s2 := strconv.FormatFloat(i2, 'f', 2, 64)
    fmt.Printf("转换后类型:%T,值:%v \n", s2, s2)
    fmt.Println()

    // bool 转 string
    b := false
    fmt.Printf("转换前类型:%T,值:%v \n", b, b)
    s3 := strconv.FormatBool(b)
    fmt.Printf("转换后类型:%T,值:%v \n", s3, s3)
    fmt.Println()

    // int64 转 string
    var i3 int64 = 998
    fmt.Printf("转换前类型:%T,值:%v \n", i3, i3)
    var s4 = strconv.FormatInt(i3, 10)
    fmt.Printf("转换后类型:%T,值:%v \n", s4, s4)
    fmt.Println()

}

string转int

package main

import (
    "fmt"
    "strconv"
)

// string转int
func str2int2() {
    var a string = "1234"
    i64, _ := strconv.ParseInt(a, 10, 64)
    fmt.Printf("转换前类型: %T 转换后类型: %T 值: %v \n", a, i64, i64)
}

func main() {
    str2int2()
}

string转float

package main

import (
    "fmt"
    "strconv"
)

// string转float
func str2float() {
    var a string = "3.14"
    f32, _ := strconv.ParseFloat(a, 32)
    f64, _ := strconv.ParseFloat(a, 64)
    fmt.Printf("转换前类型: %T 转换后类型: %T 值: %v \n", a, f32, f32)
    fmt.Printf("转换前类型: %T 转换后类型: %T 值: %v \n", a, f64, f64)
}

func main() {
    str2float()
}

string转bool

package main

import (
    "fmt"
    "strconv"
)

// string转bool
func str2bool() {
    var a string = "true"
    b, _ := strconv.ParseBool(a)
    fmt.Printf("转换前类型: %T 转换后类型: %T 值: %v \n", a, b, b)
}

func main() {
    str2bool()
}

string转字符

package main

import (
    "fmt"
    "strconv"
)

// string转字符
func str2ASCII() {
    var a string = "hello goland"
    for _, i := range a {
        fmt.Printf("%v(%c)  ", i, i)
    }
}

func main() {
    str2ASCII()
}

字符串反转

package main

import (
    "fmt"
    "strconv"
)

// 字符串反转
func strServer() {
    a := "test"
    r := []rune(a)
    for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    fmt.Printf(string(r))
}

func main() {
    strServer()
}

results matching ""

    No results matching ""