教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 06-值类型-2-字符串

06-值类型-2-字符串

发布时间:2023-03-19   编辑:jiaochengji.com
教程集为您提供06-值类型-2-字符串等资源,欢迎您收藏本站,我们将为您提供最新的06-值类型-2-字符串资源

文章目录

    • 一 字符
    • 二 字符串
    • 三 字符串常用操作
        • 3.1 len()函数与字符串遍历
        • 3.2 string()函数类型转换
        • 3.3 字符串连接
    • 四 strings包相关函数
    • 五 strconv包的字符串转换函数

一 字符

Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存,且使用单引号包裹。

var c1 byte = 'a'
var c2 byte = '0'
fmt.Println("c1=", c1)					//输出 97   
fmt.Println("c2=", c2)					//输出48
fmt.Printf("c1=%c,c2=%c\n", c1, c2)	    //输出原值 a 0

//var c3 byte = '北'
//fmt.Printf("c3=%c", c3)					// 溢出错误:overflows byte

贴士:

  • 字符类型也可以用d%打印为整型
  • 如果我们保存的字符在 ASCII 表的,比如[0-1, a-z,A-Z…]直接可以保存到 byte
  • 如果我们保存的字符对应码值大于 255,这时我们可以考虑使用 int 类型保存
  • 如果我们需要安装字符的方式输出,这时我们需要格式化输出,即 fmt.Printf(“%c”, c1)
  • 字符可以和整型进行运算

二 字符串

传统的字符串是由字符组成的,而Go的字符串是由单个字节连接起来的,即Go字符串是一串固定长度的字符连接起来的字符序列。

字符串在Go语言中是基本类型,内容在初始化后不能修改。

Go中的字符串都是采用UTF-8字符集编码,使用一对双引号""或反引号``定义。``可以额外解析换行,即其没有字符转义功能。

var str1 string
str1 = "Hello "
str2 := " World!"

fmt.Println(str1[0])     	// 输出字符串第一个字符 72
fmt.Println(len(str1))   	// 输出长度 6
fmt.Println(str1   str2) 	// 输出不带空格的

// 字符串不可变,编译报错: cannot assign to 因为
// str1[0] = 'c'			

由于Go中的字符串不可直接改变,可以使用下列两种方式进行修改:

方式一:通过转换为字节数组[]byte类型,构造一个临时字符串

str := "hello"

strTemp := []byte(str)
fmt.Println("strTemp=", strTemp)			// [104 101 108 108 111]

strTemp[0] = 'c'
strResult := string(strTemp)
fmt.Println("strResult=", strResult)		// strResult= cello

方式二:使用切片

str := "hello"
str = "c"  str[1:]		// 1: 表示从第1位开始到最后

Go和Java等语言一样,字符串默认是不可变的,这样保证了线程安全,大家使用的都是只读对象,无须加锁,且能很方便的共享内存,不必使用写时复制。

三 字符串常用操作

3.1 len()函数与字符串遍历

len()函数是go语言的内建函数,可以用来获取字符串、切片、通道等的长度。

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {

	str1 := "hello world"
	str2 := "你好,"

	fmt.Println(len(str1))							// 11
	fmt.Println(len(str2))							// 9
	fmt.Println(utf8.RuneCountInString(str2))		// 3
}

第一个函数输出11很容易理解,第二个函数却输出了9,理论上我们会认为应该是3才对。这是因为Go的字符串都是以UTF-8格式保存,每个中文占据3个字节。Go中计算UTF-8字符串格式的长度应该使用utf8.RuneCountInString

字符串遍历方式一:使用字节数组,注意每个中文在UTF-8中占据3个字节

str := "hello"
for i := 0; i < len(str); i   {
	fmt.Println(i,str[i])
}

字符串遍历方式二:range关键字只是第一种遍历方式的简写

str := "你好"
for i,ch := range str {
	fmt.Println(i,ch)
}

注意:由于上述len()函数本身原因,Unicode字符遍历需要使用range。

3.2 string()函数类型转换

go的内建函数 string()可以将其他类型转变为字符串类型:

num := 12
fmt.Printf("%T \n", string(num))			// string

3.3 字符串连接

使用 能够连接字符串。但是该操作并不高效(因为字符串在Go中是基本类型,每次拼接都是拷贝了内存!)。Go1.10提供了类似Java的StringBuilder机制来进行高效字符串连接:

package main

import (
	"bytes"
	"fmt"
)

func main() {

	str1 := "hello "
	str2 := " world"

	//创建字节缓冲
	var stringBuilder bytes.Buffer

	//把字符串写入缓冲
	stringBuilder.WriteString(str1)
	stringBuilder.WriteString(str2)

	//将缓冲以字符串形式输出
	fmt.Println(stringBuilder.String())

}

在1.10版本前,可以使用bytes.Buffer拼接字符串(因为字符串其实是字节数组):

	var buf bytes.Buffer
	buf.WriteString("hello")
	fmt.Println(buf.String())

四 strings包相关函数

strings包提供了字符串的一些常见操作函数:

//查找s在字符串str中的索引
Index(str, s string) int 

//判断str是否包含s
Contains(str, s string) bool

//通过字符串str连接切片 s
Join(s []string, str string) string

//替换字符串str中old字符串为new字符串,n表示替换的次数,小于0全部替换
Replace(str,old,new string,n int) string

//字符串str按照s分割,返回切片
Splite(str,s string)[]string

// 去除头部、尾部指定的字符串
Trim(s string, cutset string) string

// 去除空格,返回切片
Fields(s string) []string

五 strconv包的字符串转换函数

在Java中遇到 "你好" 123会将 转变为连接符。而Go语言要求 号两边数据的数据类型必须一致,这使得类似的操作变得比较不便,Go提供了strconv包用于字符串与基本类型之间的转换,常用函数有Append、Format、Parse。

package main

import (
	"fmt"
	"strconv"
)

func main() {

	// Append 系列函数将整数等转换为字符串后,添加到现有的字节数组中
	str1 := make([]byte, 0, 100)
	str1 = strconv.AppendInt(str1, 4567, 10)
	str1 = strconv.AppendBool(str1, false)
	str1 = strconv.AppendQuote(str1, "abcdefg")
	str1 = strconv.AppendQuoteRune(str1, '单')
	fmt.Println(string(str1))						// 4567false"abcdefg"'单'

	// Format 系列函数把其他类型的转换为字符串
	a := strconv.FormatBool(false)
	b := strconv.FormatFloat(123.23, 'g', 12, 64)
	c := strconv.FormatInt(1234, 10)
	d := strconv.FormatUint(12345, 10)
	e := strconv.Itoa(1023)
	fmt.Println(a, b, c, d, e)						// false 123.23 1234 12345 1023

	// Parse 系列函数把字符串转换为其他类型
	f, _ := strconv.ParseBool("false")
	g, _ := strconv.ParseFloat("123.23", 64)
	h, _ := strconv.ParseInt("1234", 10, 64)
	i, _ := strconv.ParseUint("12345", 10, 64)
	j, _ := strconv.Atoi("1023")
	fmt.Println(f, g, h, j, i, j)					// false 123.23 1234 1023 12345 1023
}
到此这篇关于“06-值类型-2-字符串”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
javascript中Split、indexOf、lastIndexOf、substring方法应用举例
Python字符串操作常用知识点(2)
PostgreSQL从菜鸟到专家系列教程(8)数据定义 字符数据类型
Python基础之基本数据类型
.net常用的字符串处理函数
2020-10-14Go语言基本类型:整型、浮点型、字符串
python如何判断变量是否是字符串
PHP字符串函数与使用分析
如何使用PHP中的字符串函数
mysql数据表类型与数据类型介绍

[关闭]
~ ~