Go中字符串

字符串

在编写程序时,我们通常会使用字符串来进行文本处理

例如:

package main

import "fmt"

func main() {
	var name string = "alex"
	fmt.Printf(name)

	title := "生活要想过得去,头上总得带点绿"
	fmt.Printf(title)
}

字符串的底层存储

计算机中的所有操作和数据最终都是二进制,即100100001011
Go语言中的字符串是utf-8编码的序列
例如:

package main

import "fmt"

func main() {
    // unicode字符集:文字 -> 码点(ucs4, 4个字节表示)
    // utf-8编码,对unicode字符集的码点进行编码最终得到:1000100001
	var name string = "mashiro"
    fmt.Printf(name)
}

又例如:

package main

import (
	"fmt"
	"strconv"
	"unicode/utf8"
)

func main() {
	// 1. 本质是utf-8编码的序列
	var name string = "王大锤"

	// 王
	fmt.Println(name[0], strconv.FormatInt(int64(name[0]), 2))
	fmt.Println(name[1], strconv.FormatInt(int64(name[1]), 2))
	fmt.Println(name[2], strconv.FormatInt(int64(name[2]), 2))

	// 大
	fmt.Println(name[3], strconv.FormatInt(int64(name[3]), 2))
	fmt.Println(name[4], strconv.FormatInt(int64(name[4]), 2))
	fmt.Println(name[5], strconv.FormatInt(int64(name[5]), 2))

	// 锤
	fmt.Println(name[6], strconv.FormatInt(int64(name[6]), 2))
	fmt.Println(name[7], strconv.FormatInt(int64(name[7]), 2))
	fmt.Println(name[8], strconv.FormatInt(int64(name[8]), 2))

	// 2. 获取字符串的长度:9(字节长度)
	fmt.Println(len(name))

	// 3. 字符串转换为一个"字节集合"
	byteSet := []byte(name)
	fmt.Println(byteSet) // [230,173,166,230,178,155,233,189,144]

	// 4. 字节的集合转换为字符串
	byteList := []byte{230, 173, 166, 230, 178, 155, 233, 189, 144}
	targetString := string(byteList)
	fmt.Println(targetString)

	// 5. 将字符串转换为 unicode字符集码点的集合    
	tempSet := []rune(name)
	fmt.Println(tempSet) // [27494 27803 40784]
	fmt.Println(tempSet[0], strconv.FormatInt(int64(tempSet[0]), 16))
	fmt.Println(tempSet[1], strconv.FormatInt(int64(tempSet[1]), 16))
	fmt.Println(tempSet[2], strconv.FormatInt(int64(tempSet[2]), 16))

	// 6. "rune集合" 转换 为字符串
	runeList := []rune{27494, 27803, 40784}
	targetName := string(runeList)
	fmt.Println(targetName)

	// 7. 长度的处理(获取字符长度)
	runeLength := utf8.RuneCountInString(name)
	fmt.Println(runeLength)
}

字符串常见功能

字符串属于在程序中最常见常用的数据类型,所以Go中为字符串提供了很多常见的操作

获取长度

package main

import (
   "fmt"
   "unicode/utf8"
)

func main() {
   var name string = "王大锤"

   fmt.Println( len(name) )                    // 获取 字节 长度,输出:8
   fmt.Println( utf8.RuneCountInString(name) ) // 获取字符长度,输出:3
}

是否以xx开头

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "王大锤"

   result := strings.HasPrefix(name, "王")

   fmt.Println(result) // 输出:true

是否以xx结尾

package main

import (
	"fmt"
	"strings"
)

func main() {
	name := "王大锤"

	result := strings.HasSuffix(name, "锤")

	fmt.Println(result) // 输出:true
}

是否包含

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "你追我如果你追到我,我就让你嘿嘿嘿"
   result := strings.Contains(name, "嘿嘿嘿")

   fmt.Println(result) // 输出:true
}

变大写

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "mashiro"

   result := strings.ToUpper(name)

   fmt.Println(result) // 输出:MASHIRO
}
// 注意:result是大写;name依然是小写。

变小写

package main

import (
	"fmt"
	"strings"
)

func main() {
	name := "MASHIRO"

	result := strings.ToLower(name)

	fmt.Println(result) // 输出:mashiro
}

去两边

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "shinamashiro"

   result1 := strings.TrimRight(name, "mashiro") // 去除右边的mashiro
   result2 := strings.TrimLeft(name, "shina")   // 去除左边的shina
   result3 := strings.Trim(name, "s")       // 去除两边的w

   fmt.Println(result1, result2, result3) // 输出:shina mashiro hinamahiro

替换

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "mashiro"

   result1 := strings.Replace(name, "m", "M", 1)  // 找到m替换为M,从左到右找第一个替换
   result2 := strings.Replace(name, "o", "0", 2)  // 找到o替换为0,从左到右找前两个替换
   result3 := strings.Replace(name, "m", "M", -1) // 找到pei替换为PE,替换所有

   fmt.Println(result1, result2, result3)

分割

package main

import (
   "fmt"
   "strings"
)

func main() {
   name := "我就让你嘿嘿嘿"
   result := strings.Split(name, "你")

   // 根据`你`进行切割,获取一个切片(类似于一个数组)
   fmt.Println(result) // [ 我就让, 嘿嘿嘿]
}

拼接

可以使用 + 让两个字符串进行拼接,但这样的拼接效率会非常的低,不建议使用,建议大家使用以下的方式:

package main

import (
	"bytes"
	"fmt"
	"strings"
)

func main() {
	// 不建议
	message := "我爱" + "北京天安门"
	fmt.Println(message)

	// 建议:效率高一些
	dataList := []string{"我爱", "北京天安门"}
	result := strings.Join(dataList, "")
	fmt.Println(result) // 我爱北京天安门

	// 建议:效率更高一些(go 1.10之前)
	var buffer bytes.Buffer
	buffer.WriteString("你想")
	buffer.WriteString("我干")
	buffer.WriteString("他")
	data := buffer.String()
	fmt.Print(data)

	// 建议:效率更更更更高一些(go 1.10之后)
	var builder strings.Builder
	builder.WriteString("哈哈哈")
	builder.WriteString("去你的吧")
	value := builder.String()
	fmt.Print(value)
}

string转换为int

package main

import (
	"fmt"
	"strconv"
)

func main() {
	num := "666"

	// 内部调用的就是 ParseInt
	var data, _ = strconv.Atoi(num)
	fmt.Println(data)
    
    // 整型转字符串(strconv.ParseInt 和 strconv.FormatInt 可用处理进制转换)
    // 十进制:整型; 其他进制:字符串形式 
    var result, err = strconv.ParseInt(num, 10, 32)
	fmt.Println(result, err)
}

int转换为string

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var result = strconv.Itoa(888)
	fmt.Println(result)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值