初始Go语言4【字符串 数据类型转换】


字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(“)中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:

s1 := "hello"
s2 := "你好"

字符串转义符

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

转义 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
单引号
" 双引号
\ 反斜杠

举个例子,我们要打印一个Windows平台下的一个文件路径:

package main
import (
    "fmt"
)
func main() {
    
    
    fmt.Println("str := \"c:\\pprof\\main.exe\"")
}

多行字符串

Go语言中要定义一个多行字符串时,就必须使用反引号字符:

    s1 := `第一行
    第二行
    第三行
    `
    fmt.Println(s1)

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

字符串的常用操作

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

字符串使用

  字符串里可以包含任意Unicode字符。

s := " My name is 十一☻" 

  字符串里可以包含转义字符。

s := "He say:\"I'm fine.\" \n\\Thank\tyou.\\" 

  字符串也可以用反引号来定义,反引号里的转义字符无效。反引号里的内容原封不动地输出,包括空白符和换行符。

s := `here is first line. 

  there is third line.
`

字符串常用操作

方法 介绍
len(str) 求长度
strings.Split 分割
strings.Contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
s := "born to win, born to die."
fmt.Printf("sentence length %d\n", len(s))
fmt.Printf("\"s\" length %d\n", len("s"))  //英文字母的长度为1
fmt.Printf("\"中\"  length %d\n", len("中")) //一个汉字占3个长度
arr := strings.Split(s, " ")
fmt.Printf("arr[3]=%s\n", arr[3])
fmt.Printf("contain die %t\n", strings.Contains(s, "die"))          //包含子串
fmt.Printf("contain wine %t\n", strings.Contains(s, "wine"))        //包含子串
fmt.Printf("first index of born %d\n", strings.Index(s, "born"))    //寻找子串第一次出现的位置
fmt.Printf("last index of born %d\n", strings.LastIndex(s, "born")) //寻找子串最后一次出现的位置
fmt.Printf("begin with born %t\n", strings.HasPrefix(s, "born"))    //以xxx开头
fmt.Printf("end with die. %t\n", strings.HasSuffix(s, "die."))      //以xxx结尾

  把多个字符串拼接成一个长的字符串有多种方式。

  1. 加号连接。
  2. func fmt.Sprintf(format string, a …interface{}) string
  3. func strings.Join(elems []string, sep string) string
  4. 当有大量的string需要拼接时,用strings.Builder效率最高
s1 := "Hello"
s2 := "how"
s3 := "are"
s4 := "you"
merged := s1 + " " + s2 + " " + s3 + " " + s4
fmt.Println(merged)
merged = fmt.Sprintf("%s %s %s %s", s1, s2, s3, s4)
fmt.Println(merged)
merged = strings.Join([]string{
    
    s1, s2, s3, s4}, " ")
fmt.Println(merged)
//当有大量的string需要拼接时,用strings.Builder效率最高
sb := strings.Builder{
    
    }
sb.WriteString(s1)
sb.WriteString(" ")
sb.WriteString(s2)
sb.WriteString(" ")
sb.WriteString(s3)
sb.WriteString(" ")
sb.WriteString(s4)
sb.WriteString(" ")
merged = sb.String()
fmt.Println(merged)

  string中每个元素叫“字符”,字符有两种:

  1. byte:1个字节, 代表ASCII码的一个字符。
  2. rune:4个字节,代表一个UTF-8字符,一个汉字可用一个rune表示。

  string是常量,不能修改其中的字符。
  string可以转换为[]byte或[]rune类型。
  string底层是byte数组,string的长度就是该byte数组的长度, UTF-8编码下一个汉字占3个byte,即一个汉字占3个长度。

s1 := "My name is 十一"
arr := []byte(s1)
brr := []rune(s1)
fmt.Printf("last byte %d\n", arr[len(arr)-1]) //string可以转换为[]byte或[]rune类型
fmt.Printf("last byte %c\n", arr[len(arr)-1]) //byte或rune可以转为string
fmt.Printf("last rune %d\n", brr[len(brr)-1])
fmt.Printf("last rune %c\n", brr[len(brr)-1])
L := len(s1)
fmt.Printf("string len %d byte array len %d rune array len %d\n", L, len(arr), len(brr))
for _, ele := range s1 {
    
    
    fmt.Printf("%c ", ele) //string中的每个元素是字符
}
fmt.Println()
for i := 0; i < L; i++ {
    
    
    fmt.Printf("%c ", s1[i]) //[i]前面应该出现数组或切片,这里自动把string转成了[]byte(而不是[]rune)
}

数据类型转换

  强制类型转换的基本方法就是把目标类型放在变量前面,把变量括起来。

var i int = 9
var by byte = byte(i)		//int转为byte
i = int(by)		//byte转为int
  • 低精度向高精度转换没问题,高精度向低精度转换会丢失位数。
  • 无符号向有符号转换,最高位是符号位。
  • byte和int可以互相转换。
  • float和int可以互相转换,小数位会丢失。
  • bool和int不能相互转换。
  • 不同长度的int或float之间可以相互转换。
//高精度向低精度转换,数字很小时这种转换没问题
var ua uint64 = 1
i8 := int8(ua)
fmt.Printf("i8=%d\n", i8)

//最高位的1变成了符号位
ua = uint64(math.MaxUint64)
i64 := int64(ua)
fmt.Printf("i64=%d\n", i64)

//位数丢失
ui32 := uint32(ua)
fmt.Printf("ui32=%d\n", ui32)

//单个字符可以转为int
var i int = int('a')
fmt.Printf("i=%d\n", i)

//bool和int不能相互转换

//byte和int可以互相转换
var by byte = byte(i)
i = int(by)
fmt.Printf("i=%d\n", i)

//float和int可以互相转换,小数位会丢失
var ft float32 = float32(i)
i = int(ft)
fmt.Printf("i=%d\n", i)

string和其他数据类型互转。

var err error
var i int = 8
var i64 int64 = int64(i)
//int转string
var s string = strconv.Itoa(i) //内部调用FormatInt
s = strconv.FormatInt(i64, 10)
//string转int
i, err = strconv.Atoi(s)
//string转int64
i64, err = strconv.ParseInt(s, 10, 64)

//float转string
var f float64 = 8.123456789
s = strconv.FormatFloat(f, 'f', 2, 64) //保留2位小数
fmt.Println(s)
//string转float
f, err = strconv.ParseFloat(s, 64)

//string<-->[]byte
var arr []byte = []byte(s)
s = string(arr)

//string<-->[]rune
var brr []rune = []rune(s)
s = string(brr)

fmt.Printf("err %v\n", err)

猜你喜欢

转载自blog.csdn.net/m0_52896752/article/details/129873560
今日推荐