go语言学习日记10.21

188 阅读4分钟

go语言学习日记10.21

前言

警钟长鸣,今天距离四级考试还有58天,而我还没有开始复习英语。不要慌,问题不大。什么四级哪有我go语言香。今天上了一天的课,概率论作业本还没找到,麻了,只能明天汇编课的时候去写了。

数据类型-续

4.字符和字符串

go语言中的字符和字符串是以基本数据类型的形式存在的,这点和java与c++不同,java和c++都是通过类来实现的。go语言里面的字符串内部是 UTF-8编码。这个编码就很好,可以输出中文了。简单的介绍一下UTF-8。

UTF-88-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组成。

\