文档章节

Go圣经-学习笔记之基础数据类型

cdh0805010
 cdh0805010
发布于 2017/10/22 20:31
字数 1377
阅读 56
收藏 0

上一篇 Go圣经-学习笔记之程序结构(二)

下一篇 Go圣经-临时插入ORM的小trick

前言

Go语言的数据类型分为四类:基础类型复合类型引用类型接口类型。其中

  • 基础类型,包括:int, uintfloat, string, bool
  • 复合类型,包括:结构体数组。它们由一个或者多个元素组成更加复杂的数据结构
  • 引用类型,包括:指针slicemapchanfunc
  • 接口类型

字符串

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, stringsstrconvunicode, 其中前两个标准库比较相似,一个针对比特流,一个针对字符串。举两个例子简单使用一下标准库: 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常量生成器了。

© 著作权归作者所有

cdh0805010

cdh0805010

粉丝 38
博文 36
码字总数 42295
作品 4
深圳
私信 提问
Go圣经-学习笔记之程序结构(二)

上一篇 Go圣经-学习笔记之程序结构 下一篇 Go圣经-学习笔记之基础数据类型 由类型引出的interface处理 虽然两个类型的底层数据类型相同,但是它们是两种不同的数据类型。它们是不能用来直接进...

cdh0805010
2017/10/22
56
0
Go圣经-临时插入ORM的小trick

上一篇 Go圣经-学习笔记之基础数据类型 下一篇 Go圣经-学习笔记之复合类型 有关orm的指针传递trick 比如:我们用beego框架中的orm模型,使用了事务,则肯定会遇到事务的开始、提交和回滚操作...

cdh0805010
2017/10/22
202
0
go语言文件汇总

归并排序及go语言实现 堆排序算法及go语言实现 Go语言基础学习(一)变量 【Leetcode】:Counting Bits问题 in Go语言 基于go语言的心跳响应 【Leetcode】:Single Number III问题 in Go语言 ...

d_watson
2016/04/15
137
2
Go圣经-学习笔记之方法值和表达式

上一篇 Go圣经-学习笔记之封装还是组合 下一篇 Go圣经-学习笔记之接口 方法值和方法表达式 了解过前面的函数值用法,应该就会使用方法值,在方法值中,接收者对象成为了引用环境中的参数变量...

cdh0805010
2017/10/27
80
0
Go圣经-学习笔记入门bufio.Scanner

上一篇 Go圣经-学习笔记入门bufio 下一篇 Go圣经-学习笔记入门bufio.Writer 由bufio.Reader引出的问题 由上篇文章《Go圣经-学习笔记入门bufio》,我们可以知道,bufio.Reader结构体中所有读取...

cdh0805010
2017/10/21
245
0

没有更多内容

加载失败,请刷新页面

加载更多

js如何控制table中的某一行动态置顶

两行代码搞定: $('#'+item.roadCode).fadeOut().fadeIn();//获取到需要置顶的行 $(".table").prepend($('#'+item.roadCode)); 其中,fadeOut()方法 作用 --- 从可见到隐藏 如下: prepend(......

码妞
今天
4
0
四种解决Nginx出现403 forbidden 报错的方法

我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log。打开日志发现报错Permission denied,详细报错如下: 1....

dragon_tech
今天
3
0
获取RestResultResponse返回的值

Springboot项目,需要调其他服务的接口,返回值类型是RestResultResponse 打断点的结果集是这个 打印出来的getData(): [{id=3336b624-8474-4dd9-bd5b-c7358687c877, paraNo=104, para=Postpo...

栾小糖
今天
4
0
【小学】 生成10以内的加减法

#!/usr/bin/env python# coding: utf-8from random import randrange# 题目的最大数值R_MAX = 10# 生成的题目的数量R_PAGE = 70# 生成减法列表def get_sub_list():...

Tensor丨思悟
今天
11
0
JavaScript设计模式——适配器模式

  适配器模式是设计模式行为型模式中的一种模式;   定义:   适配器用来解决两个已有接口之间不匹配的问题,它并不需要考虑接口是如何实现,也不用考虑将来该如何修改;适配器不需要修...

有梦想的咸鱼前端
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部