您的位置:首页 > 编程语言 > Go语言

6.Go语言基本类型 —— 字符串类型

2019-06-13 23:19 507 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/FHD994603831/article/details/91906687

字符串类型

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。字符串是 UTF-8 字符的一个序列,当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节。
在go中,字符串是一种内置的类型。

字符串包括解释型和原生型(raw):

解释字符串
该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:

\n:换行符
\r:回车符
\t:tab 键
\u 或 \U:Unicode 字符
\\:反斜杠自身

非解释字符串raw
该类字符串使用括起来,支持换行,例如:The quick brown fox jumps over a lazy dog.\r\n中的\r\n` 会被原样输出。

可以使用数组下标的形式获取字符,但是注意,不能用这种方式对字符进行修改。源程序

package main
func main() {
var str string                                     //声明一个string类型的变量
str = `The quick brown fox jumps over a lazy dog.` //赋值
r  := str[0]                                       //获取第一个元素的值
length := len(str)                                 //字符串的长度
str[0] = 's'                                       //编译报错:cannot assign to str[0]
}

注意事项和使用细节*

  1. Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文乱码问题不会再困扰程序员。
  2. 字符串一旦赋值了,字符串就不能修改了:在Go中字符串是不可变的。
  3. 字符串的两种表示形式
    双引号, 会识别转义字符
    反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防攻击、输出源代码等效果 【案例演示】
  4. 字符串拼接方式
  5. 当一行字符串太长时,需要使用到多行字符串,可以如一下操作
  6. 字符串的长度用len计算字符串拼接用 +。
    两个字符串 str1 和 str2 可以通过 str := str1 + str2 拼接在一起。
  7. str2 追加在 str1 尾部并生成一个新的字符串。也可以使用+=来拼接 str1 += str2
  8. 在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join()。最好的方法是使用bytes.Buffer来拼接。我从网上找到了一个小例子,对这几种方式的速度进行了比较:源程序
package main
import (
"bytes"
"fmt"
"strings"
"time"
)
func benchmarkStringFunction(n int, index int) (d time.Duration) {
v := "ni shuo wo shi bu shi tai wu liao le a?"
var s string
var buf bytes.Buffer
t0 := time.Now()
for i := 0; i < n; i++ {
switch index {
case 0: // fmt.Sprintf
s = fmt.Sprintf("%s[%s]", s, v)
case 1: // string +
s = s + "[" + v + "]"
case 2: // strings.Join
s = strings.Join([]string{s, "[", v, "]"}, "")
case 3: // temporary bytes.Buffer
b := bytes.Buffer{}
b.WriteString("[")
b.WriteString(v)
b.WriteString("]")
s += b.String()
case 4: // stable bytes.Buffer
buf.WriteString("[")
buf.WriteString(v)
buf.WriteString("]")
}
if i == n-1 {
if index == 4 { // for stable bytes.Buffer
s = buf.String()
}
fmt.Println("String length:", len(s)) // consume s to avoid compiler optimization
}
}
t1 := time.Now()
d = t1.Sub(t0)
fmt.Printf("time of way(%d)=%v\n", index, d)
return d
}
func main() {
k := 5
d := [5]time.Duration{}
for i := 0; i < k; i++ {
d[i] = benchmarkStringFunction(10000, i)
}
for i := 0; i < k-1; i++ {
fmt.Printf("way %d is %6.1f times of way %d\n", i, float32(d[i])/float32(d[k-1]), k-1)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: