go语言学习日记10.21
前言
警钟长鸣,今天距离四级考试还有58天,而我还没有开始复习英语。不要慌,问题不大。什么四级哪有我go语言香。今天上了一天的课,概率论作业本还没找到,麻了,只能明天汇编课的时候去写了。
数据类型-续
4.字符和字符串
go语言中的字符和字符串是以基本数据类型的形式存在的,这点和java与c++不同,java和c++都是通过类来实现的。go语言里面的字符串内部是 UTF-8编码。这个编码就很好,可以输出中文了。简单的介绍一下UTF-8。
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于Unicode标准的一部分,最初由肯·汤普逊和罗布·派克提出。[2][3]由于较小值的编码点一般使用频率较高,直接使用Unicode编码效率低下,大量浪费内存空间。UTF-8就是为了解决向后兼容ASCII码而设计,Unicode中前128个字符,使用与ASCII码相同的二进制值的单个字节进行编码,而且字面与ASCII码的字面一一对应,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或发送文字优先采用的编码方式。
以上内容来自维基百科
在UTF-8编码中:一个中文等于三个字节,中文标点占三个字节。 一个英文字符等于一个字节,英文标点占一个字节。
go里面的字符用' '字符串用" "。这一点严格区分(说的就是你JS)。
package main
import "fmt"
func main(){
s1 := "Hello"
s2 := 'c'
fmt.Println(s1)
fmt.Println(s2) // 直接输出是输出字符的ASC嘛
fmt.Printf("%c", s2) // 输出字符需要用到格式化输出
}
Hello 99 c
转义字符
go中的转义字符和其它语言 我是感觉没区别的。可能我平时用的也不多。
\r | 回车符(返回行首) |
|---|---|
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
' | 单引号 |
" | 双引号 |
\ | 反斜杠 |
多行字符串
有时候,我们可能需要输出多行字符串。这个时候我们可以实验 ``来包裹我们的多行字符串。输出的时候,会原封不动的输出我们 ``里面的内容,包括空格。
package main
import "fmt"
func main(){
s3 := `
欲买桂花酒,
终不似少年游
`
fmt.Println(s3)
}
欲买桂花酒,
终不似少年游
字符串的一些常用操作
| en(str) | 求长度 |
|---|---|
| +或fmt.Sprintf | 拼接字符串 |
| strings.Split | 分割 |
| strings.contains | 判断是否包含 |
| strings.HasPrefix,strings.HasSuffix | 前缀/后缀判断 |
| strings.Index(),strings.LastIndex() | 子串出现的位置 |
| strings.Join(a[]string, sep string) | join操作 |
package main
import (
"fmt"
"strings"
)
func main(){
// 字符串常用的方法
// len(str) 求长度
s4 := "I think I can not leave you"
fmt.Println(len(s4))
// 拼接字符串
// +
s5 := " truly"
ss := s4 + s5
fmt.Println(ss)
// fmt.Sprintf
ss1 := fmt.Sprintf(s4,s5)
fmt.Println(ss1)
// strings.Split
fmt.Println(strings.Split(s4," "))
// 判断是否包含
fmt.Println(strings.Contains(s4,"can"))
// 前缀后缀判断
fmt.Println(strings.HasPrefix(s4,"I"))
fmt.Println(strings.HasSuffix(s4,"can"))
// 字串出现的位置
fmt.Println(strings.Index(s4,"I"))
fmt.Println(strings.LastIndex(s4,"I"))
}
27 I think I can not leave you truly I think I can not leave you%!(EXTRA string= truly) [I think I can not leave you] true true false 0 8
byte和rune类型
go语言的字符有两种
1.uint8类型 byte类型 代表了ASCII码的一个字符
2.rune类型 代表了一个UTF-8字符 实际上是int32也就是四个字节
rune类型主要是为了照顾Unicode。
package main
import "fmt"
func main() {
s :="hello world"
for i := 0; i < len(s); i++ {
fmt.Printf("%v(%c)",s[i],s[i])
}
fmt.Println()
for _, r := range s{
fmt.Printf("%v(%c)",r,r)
}
}
104(h)101(e)108(l)108(l)111(o)32( )119(w)111(o)114(r)108(l)100(d) 104(h)101(e)108(l)108(l)111(o)32( )119(w)111(o)114(r)108(l)100(d)
字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
\