文档章节

go语言学习-数据类型

solate
 solate
发布于 2016/07/14 11:24
字数 1098
阅读 7
收藏 0

go语言学习-数据类型

基础类型

  • 布尔类型:bool。 //false
  • 整型:int8、byte、int16、int、uint、uintptr等。 //0
  • 浮点类型:float32、float64。 //0
  • 复数类型:complex64、complex128。 //(0+0i)
  • 字符串:string。//""
  • 字符类型:byte,rune。 //0
  • 错误类型:error。 //nil

##复合类型(初始值 nil)

  • 指针(pointer,uintptr):保存指针的32位或64位整数。
  • 数组(array)
  • 切片(slice)
  • 字典(map)
  • 通道(chan)
  • 结构体(struct)
  • 接口(interface)
  • 方法(function)

int

go语言有13种整形,其中有2种只是名字不同,实质是一样的,所以,实质上go语言有11种整形。如下:

  1. int :依赖不同平台下的实现,可以是int32或int64
  2. int8 : (-128->127)
  3. int16: (-32768->32767)
  4. int32: (-2 147 483 648->2 147 483 647)
  5. int64 :(-9 223 372 036 854 775 808->9 223 372 036 854 775 807)
  6. unit : 依赖不同平台下的实现,可以是int32或int64
  7. unit8 (又名byte): (0->255)
  8. unit16 : (0->65535)
  9. unit32 (又名rune):  (0->4 294 967 295)
  10. unit64 : (0->18 446 744 073 709 551 615)
  11. unitptr : 恰好容纳指针值的类型,对32位平台是unit32,对64位平台是unit64

string rune byte 的关系

字符串是用一对双引号("")或反引号(` `)括起来定义

在Go当中 string底层是用byte数组存的,并且是不可以改变的。

中文字符是用3个字节存的,在计算index的可以会不一样

例如:

s:="Go编程" 
fmt.Println(len(s)) //结果是8,中文字符是用3个字节存的。
fmt.Println(len(string(rune('编')))) //结果是3

如果想要获中文长度也为1,需要先转换为rune切片再使用内置的len()函数

fmt.Println(len([]rune(s))) //结果是4。

所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个[]byte。 要想访问中文的话,还是要用rune切片,这样就能按下标访问。

rune 能操作 任何字符, byte 不支持中文的操作

string 大量拼接

在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join(),有没有更好地办法了?有!使用字节缓冲(bytes.Buffer)拼接更加给力

字符串遍历

1.字节数组(byte),中文在utf-8中占3字节

str := "Hello,世界"
n := len(str)
for i := 0; i < n; i++ {
    ch := str[i] // 依据下标取字符串中的字符,类型为byte
    fmt.Println(i, ch)
}


2.以Unicode字符遍历


str = "Hello,世界"
for i, ch := range str {
    fmt.Println(i, ch)//ch的类型为rune }


}

字符类型

Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。

rune相关的操作,可查阅Go标准库的unicode包。另外unicode/utf8包也提供了UTF8和Unicode之间的转换

float比较

因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等是不可行的,这可能会导致不稳定的结果。

下面是一种推荐的替代方 :

使用中f1 > f2,math.Dim返回的是x-y与0中大的那个值

import "math"

// p为用户自定义的比较精度0.00001
func IsEqual(f1, f2, p float64) bool {
	return math.Dim(f1, f2) < p
}

//true 比较位数和精度相同
var a float64 = 0.0000123
var b float64 = 0.000012234
var p float64 = 0.0000001

//false p精度比比较位数更精确
var a float64 = 0.0000123
var b float64 = 0.000012234
var p float64 = 0.00000001

//false  精度0.0000002 大于比较精度
var a float64 = 0.0000124
var b float64 = 0.000012234
var p float64 = 0.0000001


	    

总结: flaot 因为底层存放的问题,并不是一个准确的值,所以在比较的时候不能直接进行相等比较,而在使用精度比较的时候,设置精度比较位数一样,如果使用第二种比比较为更精确一位则两个数就不相等了。

其他补充

string类型不能修改,需要转为[]byte,修改后再转为string. 字符串虽不能更改,但可进行切片操作

s := "hello"
c := []byte(s) // 将字符串 s 转换为 []byte 类型 c[0] = 'c'
s2 := string(c) // 再转换回 string 类型
fmt.Printf("%s\n", s2)


s := "hello"
s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作
fmt.Printf("%s\n", s)


© 著作权归作者所有

solate
粉丝 10
博文 126
码字总数 109846
作品 0
成都
程序员
私信 提问
一、C语言概述

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 为什么iOS开发要先...

长平狐
2013/03/28
121
1
大数据学习,为什么要先学Java?

  计算机编程语言有很多,目前用的多的就是Java,C++,Python,PHP等等。目前大多数学习大数据的人都是选择学习Java,那Java到底好在哪呢?为什么学大数据之前要先学Java呢?我们今天就来分...

奋斗在IT
2017/12/21
0
0
强心针:Java在数据科学领域同样是王者!

  【IT168 评论】一直以来,Python和R语言都被认为是数据科学专属的两种语言,事实上它们并不是唯一可以用于数据科学的语言,Java同样可以用户数据科学。本文中,Aaron Lazar将列出10大理由...

it168网站
2017/12/06
0
0
学习大数据为什么最好有java语言基础?

  本文需要5分钟左右阅读完成,建议收藏以后阅读,里面都是干货,可以亲自试验一下,如果觉得好用可以帮忙点赞转发一下,谢谢!交流学习java大数据可以加群460570824。   计算机编程语言...

java分享
2017/12/18
0
0
python3入门与进阶(一)

最近学习了python3的语法,整理记录一下; 语法是编程的先决条件,精通语法是编好程序的必要条件; 导语 给我最大的感觉是:这个语言的编写,居然不使用 来控制代码块的区域,而是使用缩进来...

icessun
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux高级文件数据操作

cat :显示切割数据 -f:选择显示切割列; -s:比现实没有分割的行 -d:自定义分隔符 cut -d ‘ ’-f 1,3 a.txt : 以空格为分隔符显示第一列和第三列;这种情况不能分隔的行也会显示出来,如...

为何不可1995
24分钟前
0
0
在Javascript中Eval函数的使用

【eval()函数】 JavaScript有许多小窍门来使编程更加容易。 其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。 举个小例子: var the_unevaled_ans...

花漾年华
36分钟前
3
0
[日更-2019.5.22、23] Android 系统的分区和文件系统(二)--Android 文件系统中的文件

声明 Android系统中有很多分区,每个分区内的文件系统一般都不同的,使用ADB进入系统/目录下可发现挂载这很多的目录,不同的目录中可来自不同的分区及文件系统; 那么,就来分下这些目录里面...

小馬佩德罗
40分钟前
2
0
数组操作相关算法

/*数组的相关的算法操作:1、在数组中找最大值/最小值*/class Test11_FindMax{public static void main(String[] args){int[] array = {4,2,6,8,1};//在数组中找最大...

architect刘源源
今天
4
0
okhttp3 以上版本在安卓9.0无法请求数据的解决方案

应用官方的说明:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。且Android P 限制了明文流量...

chenhongjiang
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部