一、字符串原理解析

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

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

示例如下:

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

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

3. 字符串是由byte字节组成,所以字符串的长度是byte字节的长度

示例见示例1-1

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

补充:

1) 字符与字节关系?

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

2)  UTF8编码?

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

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

实例1-1

package main

import (
"fmt"
) func main() {
var str string
str = "abc汉子"
var b []byte = []byte(str) //将str强制转换为字节数组([]byte)
var chars []rune = []rune(str) //将str转换为rune数组([]rune) fmt.Printf("b =%v, len(str)=%d\n", b, len(str))
fmt.Printf("%c\n", )
fmt.Printf("chars =%v, chars count:%d\n", chars, len(chars)) }

执行结果:

解释:

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 := ; i < len(bytes)/; i++ { //要除以2,因为一次循环做2次操作
//fmt.Printf("%c ", str[i]) //打印出来的是字符串中的字节数组
//通过将第一个和最后一个进行交换实现逆序
var tmp = bytes[i] //将前一个赋值为一个临时变量
bytes[i] = bytes[len(bytes)-i-] //将前一个赋值为后一个
bytes[len(bytes)-i-] = tmp //将后一个赋值为前一个
}
str = string(bytes) //将byte数组转换为字符串
fmt.Printf("reverse string:%s\n", str)
}

执行结果:

方法2:牛逼写法

package main

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

练习2:写一个程序,对包含中文的字符串进行逆序

package main

import (
"fmt"
) func main() {
var str = "张志凡"
bytes := []rune(str) //中文字符必须转化成rune类型 for i := ; i < len(bytes)/; i++ {
bytes[i], bytes[len(bytes)-i-] = bytes[len(bytes)-i-], bytes[i]
}
str = string(bytes)
fmt.Printf("reverse string:%v\n", str)
}

执行结果如下:

练习3:写一个程序,判断一个字符串是否是回文

回文:例如:98789, 这个数字正读是98789,倒读也是98789

package main

import (
"fmt"
) func main() {
var str = ""
bytes := []rune(str) for i := ; i < len(bytes)/; i++ {
bytes[i], bytes[len(bytes)-i-] = bytes[len(bytes)-i-], bytes[i]
}
if str == string(bytes) {
fmt.Print("为回文")
} else {
fmt.Print("不是回文")
} }

执行结果:

Go语言基础之2--字符串详解的更多相关文章

  1. 零基础入门C语言超详细的字符串详解

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, ...

  2. Go语言基础之7--函数详解

    一. 函数介绍 1.1 定义 函数:有输入.有输出,用来执行一个指定任务的代码块. func functionname([parametername type]) [return type] { // ...

  3. C语言中字符串详解

    C语言中字符串详解 字符串时是C语言中非常重要的部分,我们从字符串的性质和字符串的创建.程序中字符串的输入输出和字符串的操作来对字符串进行详细的解析. 什么是字符串? C语言本身没有内置的字符串类型, ...

  4. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  5. Python变量和字符串详解

    Python变量和字符串详解 几个月前,我开始学习个人形象管理,从发型.妆容.服饰到仪表仪态,都开始做全新改造,在塑造个人风格时,最基础的是先了解自己属于哪种风格,然后找到参考对象去模仿,可以是自己欣 ...

  6. SQL Server日期时间格式转换字符串详解

    本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...

  7. [五]基础数据类型之Short详解

      Short 基本数据类型short  的包装类 Short 类型的对象包含一个 short 类型的字段      原文地址:[五]基础数据类型之Short详解   属性简介   值为  215-1 ...

  8. MS SQL Server 数据库连接字符串详解

    MS SQL Server 数据库连接字符串详解 原地址:http://blog.csdn.net/jhhja/article/details/6096565 问题 : 超时时间已到.在从池中获取连接 ...

  9. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  10. Qt零基础教程(四) QWidget详解篇

    在博客园里面转载我自己写的关于Qt的基础教程,没次写一篇我会在这里更新一下目录: Qt零基础教程(四) QWidget详解(1):创建一个窗口 Qt零基础教程(四) QWidget详解(2):QWid ...

随机推荐

  1. B和strong以及i和em的区别(转)

    B和strong以及i和em的区别 (2013-12-31 13:58:35) 标签: b strong i em 搜索引擎 分类: 网页制作 一直以来都以为B和strong以及i和em是相同的效果, ...

  2. return()函数

    在函数中,执行完return()函数后,下面的语句就不会再执行了.例子: <?php function fn() { echo "you are awsome"; retur ...

  3. win10右击windows键没有反应解决方案(1707版本)

    按Win+R打开运行,输入“regedit”打开注册表编辑器. 2.在“HKEY_CLASSES_ROOT”主键下找到“linkfile”或者".lnkfile"字符串值项,在右侧 ...

  4. SQL获取时间戳流水号

    流水号生成规则: 1:流水号总长度为22位数 2:流水号总共分三部分:标头(2位)+ 时间戳(YYYYMMDDHHmmSSsss共17位)+ 随机码(3位) 举例流水号:SN2015081210240 ...

  5. iOS 通过接受距离传感器的消息改变屏幕的明暗度(仅限用于真实的手机)

    #import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL ...

  6. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  7. Entity Relationships

    Entity Relationships: Here, you will learn how entity framework manages the relationships between en ...

  8. 抽象类(abstract)【转】

    抽象类(abstract) abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其它类的基类.标记为抽象或包含在抽象类中的成员必须通 ...

  9. 为什么使用docker

    为什么要使用Docker? 作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 由于容器不需要进行硬件虚拟及运行完整操作系统等额外开销,Docker对系 ...

  10. [SinGuLaRiTy] NOIP 膜你赛-Day 2

    [SinGuLaRiTy-1031] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有题目: Time Limit: 1s | Mem ...