Go 快速入门指南 - 字符切片

广寒仙子
• 阅读 755

概述

建议先阅读 字符串, 切片 两个小节。

由于字符串不可变,如果每次以 重新赋值 的方式改变字符串,效率会非常低,这时应该使用 []byte 类型,[]byte 元素可以被修改。

因为 byte 类型是 uint8 类型的别名,所以 []byte 也就是 []uint8

语法规则

字符串转化为 []byte

package main

import "fmt"

func main() {
    s := "hello world"
    b := []byte(s)
    fmt.Printf("b type = %T, val = %s\n", b, b)
}

// $ go run main.go
// 输出如下
/**
  b type = []uint8, val = hello world
*/

[]byte 转换为字符串

package main

import "fmt"

func main() {
    b := []byte{'h', 'e', 'l', 'l', '0', ' ', 'w', 'o', 'r', 'l', 'd'}
    s := string(b)
    fmt.Printf("s type = %T, val = %s\n", s, s)
}

// $ go run main.go
// 输出如下
/**
  s type = string, val = hell0 world
*/

长度计算

关于字符串不同编码对长度的计算方式,感兴趣的读者可以参考扩展阅读。

ASCII

package main

import "fmt"

func main() {
    b := []byte{'h', 'i'}
    fmt.Printf("b length = %d\n", len(b))
}

// $ go run main.go
// 输出如下
/**
  b length = 2
*/

中文算作 3 个字符

package main

import "fmt"

func main() {
    b := []byte("我是")
    fmt.Printf("b length = %d\n", len(b))
}

// $ go run main.go
// 输出如下
/**
  b length = 6
*/

中文算作 1 个字符

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    b := []byte("我是")
    fmt.Printf("b length = %d\n", utf8.RuneCount(b))
}

// $ go run main.go
// 输出如下
/**
  b length = 2
*/

扩展阅读

  1. 十分钟搞清字符集和字符编码

联系我

Go 快速入门指南 - 字符切片

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中stringBuilder的用法
String对象是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循
Wesley13 Wesley13
3年前
String、StringBuffer、StringBuilder的区别
String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String
Easter79 Easter79
3年前
str的用法
  字符串的索引切片以及常用的操作方法都是形成新的字符串,和原字符串没有关系 切片和索引\按照索引取值按照切片取值,顾头不顾尾,切片加步长 只要倒叙取值就要加上反向步长capitalize() 首字母大写\center() 将字符串居中可以添加填充物\swapcase() 大小写反转
九路 九路
4年前
Go语言字符串和数值转换
一.字符串概述字符串是一段不可变的字符序列.内容是任意内容,可以是一段文字也可以是一串数字,但是字符串类型数字不能进行数学运算,必须转换成整型或浮点型字符串类型关键字:string创建字符串类型变量govarsstring"hello,world"s1:"hello,world"字符串类型的值使用双引号""扩上
Easter79 Easter79
3年前
String Builder 源码分析
!(https://oscimg.oschina.net/oscnet/2af3de6213a842a08f7a8b1544c6ebf0.png)StringBuilder与StringBuffer区别StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。StringBuffer可变字符串,线程安全,但效率
Stella981 Stella981
3年前
Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一、切片(Slice)    在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片。python中没有针对字符串的截取函数,需要通过“切片”来完成。  取一个list或tuple的部分元素可以用切片   格式: 假定list或tuple组成的元素组
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Easter79 Easter79
3年前
String ,StringBuffer ,StringBuilder 三者的理解
1.String,StringBuffer,StringBuilder三者执行效率的问题StringBuilderStringBufferStringString是字符常量,是不可变的.如果拿String来操作字符串,一旦操作的字符串的值改变了,就会在内存中创建多一个空间来保存新的字符串,这样的话String的效率就比较低下了.
Wesley13 Wesley13
3年前
JAVA常用类_String
String:一、定义1.字符串,声明为final的,不可被继。2.实现了Serializable接口:表示字符串是支持序列化的。  实现了Comparable接口:表示String可以比较大小二、特性1.String的不可变性    1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
Stella981 Stella981
3年前
Python实现字符串反转
将字符串s‘helloword’反转输出为‘drowolleh’,以下通过多种方法实现1、字符串切片法(常用)s'helloword'rs::1print(r)结果:drowolleh2、使用reducereduce() 函数会对参数序列中元素进行累积
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari