Go圣经-学习笔记之基础数据类型
2017-10-22 00:00
274 查看
摘要: ASCII、Unicode和utf-8的关系;rune和byte的关系;相关字符串处理的标准库
上一篇 Go圣经-学习笔记之程序结构(二)
下一篇 Go圣经-临时插入ORM的小trick
基础类型,包括:
复合类型,包括:
引用类型,包括:
接口类型
一个字符串是一个不可改变的字节序列,类似C++中的字面字符串,只能读不能写。
这里要注意的是len(string)的长度是指存放在内存中的字节数目(而不是rune字符数目)。所以索引操作s[i]表示内存中第i个字节值。
第
科普一下ASCII、Unicode和UTF-8之间的关系:
ASCII是当时美国为了把英语字符和二进制做映射,一个字节一个字符,一个字节有8位=2^8=256个字符表示,这对英文字符完全够用。当时如果引入了汉字等其他字符,这ASCII表肯定是不够用的
Unicode就延伸出来了,它兼容了ASCII表,就是前0-255个数字是完全对应ASCII表的,从256数字开始就映射的其他字符,包括中文字符等。那么Unicode编码的目的就是要把全世界所有国家的字符全部纳入到其中。
UTF-8应运而生,Unicode只是一个字符集,UTF-8是Unicode的一种实现方式,目前也是应用最广泛的。UTF-8最大的一个特点:它是一种变长的编码方式。它可以使用1-4个字节表示一个字符。
更多信息,需要自己上网查看。由此,我们可以知道,一个字节并不一定代表一个字符。一个rune表示一个字符。
上面在打orm的日志时,前者会格式输出,易读美观。后者是一坨,不清晰,看着日志比较吃力。
现在要输出s字符的个数和遍历s各个字符,需要借助utf-8标准库,有两种方式实现。
第一种方式:
第二种方式:
对于第一个,输入:
明白粗体部分的文字,你就秒懂iota的使用方法。在一个const声明语句中,在第一个声明的常量所在行,iota=0,然后在每一个有常量声明的行加一操作, 两个例子:一个表示一周;一个表示网络的枚举
这样的解释和例子,不知道是否明白怎么样使用iota常量生成器了。
上一篇 Go圣经-学习笔记之程序结构(二)
下一篇 Go圣经-临时插入ORM的小trick
前言
Go语言的数据类型分为四类:基础类型、
复合类型、
引用类型和
接口类型。其中
基础类型,包括:
int,
uint、
float,
string,
bool等
复合类型,包括:
结构体、
数组。它们由一个或者多个元素组成更加复杂的数据结构
引用类型,包括:
指针、
slice、
map、
chan、
func
接口类型
字符串
Go语言源文件都是用UTF-8编码。一个字符串是一个不可改变的字节序列,类似C++中的字面字符串,只能读不能写。
这里要注意的是len(string)的长度是指存放在内存中的字节数目(而不是rune字符数目)。所以索引操作s[i]表示内存中第i个字节值。
第
i字节并不一定是第
i个字符,因为对于非ASCII字符的UTF-8编码会要多两个或者多个字节。
科普一下ASCII、Unicode和UTF-8之间的关系:
ASCII是当时美国为了把英语字符和二进制做映射,一个字节一个字符,一个字节有8位=2^8=256个字符表示,这对英文字符完全够用。当时如果引入了汉字等其他字符,这ASCII表肯定是不够用的
Unicode就延伸出来了,它兼容了ASCII表,就是前0-255个数字是完全对应ASCII表的,从256数字开始就映射的其他字符,包括中文字符等。那么Unicode编码的目的就是要把全世界所有国家的字符全部纳入到其中。
但是这里存在一个问题:可能把全世界的字符全部存储进来,可能字节大小有4~8个字节那么多,则ASCII的第一个字符只占用了一个字节,则剩下的3-7个字节都存储的0值,严重浪费空间,所以需要引入新的编码方式,尽量节约内存空间。
UTF-8应运而生,Unicode只是一个字符集,UTF-8是Unicode的一种实现方式,目前也是应用最广泛的。UTF-8最大的一个特点:它是一种变长的编码方式。它可以使用1-4个字节表示一个字符。
更多信息,需要自己上网查看。由此,我们可以知道,一个字节并不一定代表一个字符。一个rune表示一个字符。
字符串字面值
如果一个字符串太长,你想要主动换行,可以用反引号代替双引号,它里面的字符没有转义操作,同时可以跨越多行,例如:// 格式好看的写法,使用反引号 var buffer bytes.Buffer buffer.WriteString(` SELECT sale_order_id, amount FROM sale_order WHERE company_id=? AND user_id=? AND status=? `) // 格式不好看的写法,使用双引号 buffer.WriteString("SELECT sale_order_id, amount FROM sale_order WHERE company_id=? AND user_id=? AND status=?") (*o).Raw(buffer.String(), soId, uId, consts.STATUS_OK).QueryRows(&sos)
上面在打orm的日志时,前者会格式输出,易读美观。后者是一坨,不清晰,看着日志比较吃力。
byte和rune使用
对于中文字符串的输出:var s:="hello, "世界"
现在要输出s字符的个数和遍历s各个字符,需要借助utf-8标准库,有两种方式实现。
第一种方式:
for i:=0;i<len(s);{ r, size:=utf8.RuneCountInString(s[i:]) // 获取一个字符, 且返回一个字符和字符所占字节数 fmt.Printf("%d\t%c\n", i, r) i+=size }
第二种方式:
// 这个range是遍历字符, 隐式解码 for i, r:= range s{ fmt.Printf("%d\t%c\t%d", i, r, r) }
有关字符串处理的标准库
常用的字符串处理的标准库有四个:bytes,
strings,
strconv和
unicode, 其中前两个标准库比较相似,一个针对比特流,一个针对字符串。举两个例子简单使用一下标准库: 1. 实现类似linux中的basename命令;2.int型的动态数组字符串输出;
对于第一个,输入:
basename a/b/c.go, 输出:
c
func basename(s string) string{ slash:=strings.LastIndex(s, "/") s = s[slash+1:] if dot:= strings.LastIndex(s, "."); dot>=0 { s=s[:dot] } return s }
func intsToString(elems []int) string{ var buffer bytes.Buffer buffer.WriteString("[") for index, elem:= range elems{ if index >0 { buffer.WriteString(", ") } fmt.Fprintf(&buffer, "%d", elem) } buffer.WriteString("]") return buffer.String() } func main(){ fmt.Println(intsToString([]int{1,2,3}) // "[1, 2, 3]" }
iota理解和使用
初学者可能对iota的使用不是很了解,常量声明可以使用iota常量进行初始化,但不是每一行都需要写一遍初始化表达式。明白粗体部分的文字,你就秒懂iota的使用方法。在一个const声明语句中,在第一个声明的常量所在行,iota=0,然后在每一个有常量声明的行加一操作, 两个例子:一个表示一周;一个表示网络的枚举
type Weekday int const ( Sunday Weekday = iota // iota =0 Monday // iota =1 Tuesday // iota =2 Wednesday Thursday Friday // ...... Saturday // iota = 6 )
type Flags uint const ( FlagUp Flags = 1 << iota // is up FlagBroadcast // supports broadcast access capability FlagLoopback // is a loopback interface FlagPointToPoint // belongs to a point-to-point link FlagMulticast // supports multicast access capability ) // 其实上面表示 xx Flags = 1 << iota, 比如第三行,iota=2;则第三行的常量值等于1<<2 =4。
这样的解释和例子,不知道是否明白怎么样使用iota常量生成器了。
相关文章推荐
- Go学习笔记之基础数据类型
- Go学习笔记之基础数据类型
- 【学习笔记三】最基本的JAVA基础[数据类型,运算符]
- Java基础学习笔记 -- 4(基本数据类型)
- 【Java学习笔记】基础知识学习1【基本输出,数据类型,基础运算符号】
- 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张
- 嵌入式开发之C基础学习笔记03--基本数据类型,操作符,修饰符等基本概念
- JAVA基础学习笔记(2):八种基本数据类型
- SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
- 黑马程序员--Java基础学习笔记【数组操作、基本数据类型包装类】
- java基础学习笔记——基本数据类型对象包装类
- C\C++ 程序员从零开始学习Android - 个人学习笔记(四) - java基础 - 数据类型、变量、字符串、数组
- 小甲鱼:Python学习笔记001_变量_分支_数据类型_运算符等基础
- iOS学习笔记之-C语言基础02(关键字、标识符、注释、数据类型)
- Java学习笔记(一) Java基础以及数据类型介绍
- 【Swift】学习笔记(一)——初识 基础数据类型,代码风格,元组,断言
- 【零基础入门学习Python笔记005】闲聊之Python的数据类型
- Java基础学习笔记(一)基本数据类型
- MySql 基础学习笔记 1——概述与基本数据类型: 整型: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的区别 图 浮点型:命令
- 黑马程序员—Java基础学习笔记之数据类型转换(自动转换和强制转换)