zoukankan      html  css  js  c++  java
  • Go语言入门2--字符串详解

     一、字符串原理解析

    1字符串底层就是一个byte数组,所以可以和[]byte类型互相转换;(字符串可以存文本,也可以存二进制,因为其本来就是一个字节流)

    2.  字符串之中的字符是不能修改的,字符串是一个只读的类型,不能直接修改,那怎么修改呢(待解决(练习题中练习1有解决(转换为字节数组进行修改)))?

    示例如下:

    我们可以发现已经飘红了,并有英文提示不能修改字符串中的字符。

    说明Go语言中字符串是一个只读的类型,并不能直接修改。

    3. 字符串是由byte字节组成,所以字符串的长度是byte字节的长度,byte是一个int8别名

    示例见示例1-1

    4. rune类型用来表示utf8字符,一个rune字符由1个或多个byte组成,rune是一个int32的别名

    补充:

    1) 字符与字节关系?

    答:如果是英文字符,1个字符对应1个byte(字节),如果是中文字符,1个字符对应2个,甚至是3个、4个byte;

    2)  UTF8编码?

    答:utf8针对最大的好处是,其实可变的,如果是英文字符,其就给1个byte,如果是中文就根据其需要的给定指定的字符个数,这对于网络带宽的节省是很重要的。

    3)  rune类型其实就是int32类型;

    实例1-1

    //声明array.go文件属于 main包
    package main
    
    //引入其他的包 fmt是系统的标准输入输出库
    import (
    	"fmt"
    )
    
    //入口执行函数,main包必须有一个main函数,这个在go语言中是强制的
    func main() {
    	//声明一个str变量 类型为 string  字符串
    	var str string //方法二 str := "string" 等
    	str = "abc汉子"
    
    	//声明一个byte数组也可以叫字节数组都是一个意思
    	var b []byte = []byte(str)     //方法二 b :=[]byte(str)  //将str强制转换为字节数组([]byte)
    	var chars []rune = []rune(str) //将str转换为rune数组([]rune)
    
    	//格式化打印b的值和b字节数组的长度
    	fmt.Printf("b =%v,len(str)=%d
    ", b, len(str))
    	fmt.Printf("%c
    ", 97)
    	fmt.Printf("chars=%v,chars count:%d
    ", chars, len(chars))
    
    }

    执行结果如下:

    d:PROJECTsrcase-3array-1>go run array.go
    b =[97 98 99 230 177 137 229 173 144],len(str)=9
    a
    chars=[97 98 99 27721 23376],chars count:5
    

    解释:

    1) 输出的就是ASCII码(字符,不论是英文还是中文在底层存储的都是一个整数ASCII码),97对应的就是a;

    2) 由实例看到一个"汉"字由三个字节组成,对应的ASCII码为230 177 137;

    3) str字符串的长度为9,因为底层存储的是字节数组,可以看到输出9个字节,所以长度为9,而不是表面我们数的5个(字符是5个);

    4) chars count:5 表示str字符的长度为5(我们需要将字符串(默认是ASCII编码)转换为rune类型进行计算)

    5)chars =[97 98 99 27721 23376]:表示的是str字符串各个字符对应在底层的utf8编码

    二、练习题

    练习1:写一个程序,对英文字符串进行逆序

    方法1:复杂写法

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var str string = "abcdefg"
    	bytes := []byte(str) //字符串中的字符不能直接修改,所以我们这里转成byte数组
    	//var i int
    	//i = 0
    	//var i = 0
    	for i := 0; i < len(bytes)/2; i++ { //要除以2,因为一次循环做2次操作
    		//fmt.Printf("%c ", str[i]) //打印出来的是字符串中的字节数组
    		//通过将第一个和最后一个进行交换实现逆序
    		var tmp = bytes[i]               //将前一个赋值为一个临时变量
    		bytes[i] = bytes[len(bytes)-i-1] //将前一个赋值为后一个
    		bytes[len(bytes)-i-1] = tmp      //将后一个赋值为前一个
    	}
    	str = string(bytes) //将byte数组转换为字符串
    	fmt.Printf("reverse string:%s
    ", str)
    }
    

    执行结果:

    d:PROJECTsrcday1day-1ase-3array-2>go run main.go
    reverse string:gfedcba
    

    方法2:高级写法

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var str string = "abcdefg"
        bytes := []byte(str)
        for i := 0; i < len(bytes)/2; i++ {
            bytes[i], bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1], bytes[i]  //两个变量拿起来直接交换即可
        }
        str = string(bytes) //将byte数组转换为字符串
        fmt.Printf("reverse string:%s
    ", str)
    }
    

      

      

      

      

     

      

      

  • 相关阅读:
    个人技术总结--MUI框架的h5+前端开发
    无废话MVC入门教程四[视图中的Layout使用]
    VMware Workstation 12 安装大于4GB的GHOST 64位win7系统
    转:VMware Workstation 14虚拟机安装Win7系统图文教程(详细)
    VMware Workstation Pro v15.5.6 官方版+激活密钥
    Idea 全局替换指定字符
    Springboot 使用PageHelper分页插件实现分页
    使用redis做分布式锁
    浅说缓存穿透、缓存击穿、缓存雪崩
    linux下安装mysql5.6
  • 原文地址:https://www.cnblogs.com/egrep/p/9584945.html
Copyright © 2011-2022 走看看