Go 语言是一种静态类型的编程语言,在 Go 编程语言中,数据类型用于声明函数和变量。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。编译器在进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么。

基本数据类型说明

类型 描述
uint 32位或64位
uint8 无符号 8 位整型 (0 到 255)
uint16 无符号 16 位整型 (0 到 65535)
uint32 无符号 32 位整型 (0 到 4294967295)
uint64 无符号 64 位整型 (0 到 18446744073709551615)
int 32位或64位
int8 有符号 8 位整型 (-128 到 127)
int16 有符号 16 位整型 (-32768 到 32767)
int32 有符号 32 位整型 (-2147483648 到 2147483647)
int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
byte uint8的别名(type byte = uint8)
rune int32的别名(type rune = int32),表示一个unicode码
uintptr 无符号整型,用于存放一个指针是一种无符号的整数类型,没有指定具体的bit大小但是足以容纳指针。
uintptr类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。
float32 IEEE-754 32位浮点型数
float64 IEEE-754 64位浮点型数
complex64 32 位实数和虚数
complex128 64 位实数和虚数

整型

整型数据分为两类,有符号无符号两种类型

有符号: int, int8, int16, int32, int64

无符号: uint, uint8, uint16, uint32, uint64, byte

不同位数的整型区别在于能保存整型数字范围的大小;

有符号类型可以存储任何整数,无符号类型只能存储自然数

int和uint的大小和系统有关,32位系统表示int32和uint32,如果是64位系统则表示int64和uint64

byte与uint8类似,一般用来存储单个字符

在保证程序正确运行下,尽量使用占用空间小的数据类型

fmt.Printf("%T", var_name)输出变量类型

unsafe.Sizeof(var_name)查看变量占用字节

浮点型

浮点型也就是小数类型,可以存放小数。比如6.6,-12.34

  1. 关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位

  2. 尾数部分可能丢失,造成精度损失。-123.0000901

    package main
    
    import "fmt"
    
    func main() {
    
        var num1 float32 = -123.0000901
    var num2 float64 = -123.0000901
    fmt.Println("num1 = ", num1, "num2 = ", num2);
    }

    说明:float64的精度要比float32的要准确

    说明:如果我们要保存一个精度高的数,则应该选择float64

  3. 浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失

  4. golang的浮点型默认为float64类型

  5. 通常情况下,应该使用float64,因为它比float32更精确

  6. 0.123可以简写成.123,也支持科学计数法表示:5.1234e2 等价于512.34

字符

Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的

  • 字符只能被单引号包裹,不能用双引号,双引号包裹的是字符串
  • 当我们直接输出type值时,就是输出了对应字符的ASCII码值
  • 当我们希望输出对应字符,需要使用格式化输出
  • Go语言的字符使用UTF-8编码,英文字母占一个字符,汉字占三个字符
  • 在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值。
  • 可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的unicode字符
  • 字符类型是可以运算的,相当于一个整数,因为它们都有对应的unicode码
package main

import "fmt"

func main() {

    //字符只能被单引号包裹,不能用双引号,双引号包裹的是字符串
var c1 byte = 'a'
var c2 byte = '0' //当我们直接输出type值时,就是输出了对应字符的ASCII码值
//'a' ==> 97
fmt.Println(c1, "--", c2)
//如果我们希望输出对应字符,需要使用格式化输出
fmt.Printf("c2 = %c c2 = %c", c1, c2)
}

但是如果我们保存的字符大于255,比如存储汉字,这时byte类型就无法保存,此时可以使用uint或int类型保存

字符类型本质探讨

  1. 字符型存储到计算机中,需要将字符对应的码值(整数)找出来

    存储:字符 --> 码值 --> 二进制 --> 存储

    读取: 二进制 -->码值 --> 字符 --> 读取

  2. 字符和码值的对应关系是通过字符编码表决定的(是规定好的)

  3. Go语言的编码都统一成了UTF-8。非常的方便,很统一,再也没有编码乱码的困扰了

布尔型

布尔类型也叫做bool类型,bool类型数据只允许取值true或false

bool类型占1个字节

bool类型适用于逻辑运算,一般用于流程控制

字符串

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本

  1. 字符串一旦赋值了,就不能修改了:在Go中字符串是不可变的。

  2. 字符串的两种标识形式

    • 双引号,会识别转义字符

      var str = "abc\nabc" //输出时会换行
    • 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果

      var str string = `abc\nabc` //输出时原样输出,不会转义
  3. 字符串拼接方式"+"

    var str string = "hello " + "world"
    str += "!"
  4. 当一行字符串太长时,需要使用到多行字符串,可以使用如下处理

    //正确写法
    str := "hello" +
    " world!"
    fmt.Println(str) //错误写法
    str := "hello "
    + "world!"
    fmt.Println(str)

指针

  1. 基本数据类型,变量存的就是值,也叫值类型
  2. 获取变量的地址,用&,比如var num int,获取num的地址:&num
  3. 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值,比如:var ptr *int = &num
  4. 获取指针类型所指向的值,使用:*,比如,var ptr *int,使用*ptr获取ptr指向的值

指针细节说明:

  1. 值类型,都有对应的指针类型,形式为*数据类型,比如int对应的指针就是*int,float64对应的指针类型就是*float64,依此类推。
  2. 值类型包括:基本数据类型数组结构体struct

值类型与引用类型

值类型和引用类型使用特点:

值类型:变量直接存储值,内存通常在中分配

引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在上分配,当没有任何变量应用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。

Golang中值类型和引用类型的区分

  1. 值类型:基本数据类型(int系列、float系列、bool、string)、数组和结构体
  2. 引用类型:指针、slice切片、map、管道chan、interface等都是引用类型

基本数据类型默认值

在Golang中,数据类型都有一个默认值,当程序员没有赋值时,就会保留默认值,在Golang中,默认值也叫做零值。

基本数据类型默认值如下:

数据类型 默认值
整型 0
浮点型 0
字符串 ""
布尔类型 false
package main

import "fmt"

func main() {

    var a int
var b float32
var isTrue bool
var str string //这里的%v,表示按照变量的值输出
fmt.Printf("a = %v, b = %v, isTrue = %v, str = %v", a, b, isTrue, str)
fmt.Println("")
}

基本数据类型相互转换

Golang和Java/C不同,Golang在不同类型的变量之间赋值时需要显式转换。也就是Golang中数据类型不能自动转换

基本语法:

表达式var_type(var_name) 将值v转换为类型var_type

var_type:就是数据类型,比如int32, int64, float32等等

var_name:就是需要转换的变量

var num int = 42
var float float64 = float64(num)
var ui uint8 = uint8(float)
fmt.Println(num, float, ui)

注意事项

  1. Go中,数据类型的转换可以是从表示范围小-->表示范围大,也可以 范围大—>范围小

  2. 被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!

  3. 在转换中,比如将int64转成int8,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。

  4. 数据的转换必须显式转换,不能自动转换

    package main
    import "fmt" func main() { var n1 int32 = 12
    var n2 int64
    var n3 int8 n2 = n1 + 20 //int32 --> int64 错误
    n3 = n1 + 20 //int32 --> int8 错误 n2 = int64(n1) + 20 //正确
    n3 = int8(n1) + 20 //正确
    }
  5. 定义一个int8类型的整数(var num int8 = 0),如果一直自加1,这个变量的值会是(0...127 -128 -127... 0 ...127)循环往复下去,而不会超过类型最大值的范围

其他基本类型转string类型

在程序开发中,我们经常需要将数值型转成string类型,或者将string类型转成数值型。

方式1:

func Sprintf(format string, a ...interface{}) string

Sprintf根据format参数生成格式化的字符串并返回该字符串。

package main

import "fmt"

func main() {

    var num1 int = 99;
var num2 float64 = 23.456
var isTrue bool = true
var char byte = 'A' var str string str = fmt.Sprintf("%d", num1)
fmt.Printf("str类型为 %T str = %q\n",str, str) str = fmt.Sprintf("%f", num2)
fmt.Printf("str类型为 %T str = %q\n",str, str) str = fmt.Sprintf("%t", isTrue)
fmt.Printf("str类型为 %T str = %q\n",str, str) str = fmt.Sprintf("%d", char)
fmt.Printf("str类型为 %T str = %q\n",str, str)
}

输出结果为

str类型为 string str = "99"
str类型为 string str = "23.456000"
str类型为 string str = "true"
str类型为 string str = "65"

方式2:使用strconv包的函数

package main

import (
"fmt"
"strconv"
) func main() { var num1 int = 99;
var num2 float64 = 23.456
var isTrue bool = true var str string str = strconv.FormatInt(int64(num1), 10)
str = strconv.Itoa(num1)
fmt.Printf("str类型为 %T str = %q\n",str, str) str = strconv.FormatFloat(num2, 'f', 10, 64)
fmt.Printf("str类型为 %T str = %q\n",str, str) str = strconv.FormatBool(isTrue)
fmt.Printf("str类型为 %T str = %q\n",str, str)
}

输出结果为

str类型为 string str = "99"
str类型为 string str = "23.4560000000"
str类型为 string str = "true"

string类型转其他基本类型

方式1:使用strconv包的函数

package main

import (
"fmt"
"strconv"
) func main() { var str string = "true"
var str1 string = "123456"
var str2 string = "123.456" var isTrue bool
var num int64
var num2 float64 isTrue, _ = strconv.ParseBool(str)
fmt.Printf("str类型为 %T str = %v\n",isTrue, isTrue) num, _ = strconv.ParseInt(str1, 10, 64)
fmt.Printf("str类型为 %T str = %v\n",num, num) num2, _ = strconv.ParseFloat(str2, 64)
fmt.Printf("str类型为 %T str = %v\n",num2, num2) }

数据结果为:

str类型为 bool str = true
str类型为 int64 str = 123456
str类型为 float64 str = 123.456

注意:在将string类型转成其它基本数据类型时,要确保string类型能够转成有效的数据。比如,我们可以把”123“转成数字123,但是不能把”hello“转成一个整数,如果这样做,Golang直接将其转成0,其它类型也是一样的道理,float => 0, bool => false

Go语言数据类型的更多相关文章

  1. C语言数据类型的理解

    数据类型的定义: 作为一种语言,必然有所谓的语言组成要素,就像日常生活中人们之间的交流一样,首先会有字,字再成词组,再来就是句子,后来呢就是段落等等.当然不同的字,词,句这些在一起,就会有不同的表达效 ...

  2. R语言数据类型

    R语言数据类型[转!!]Zhao-Pace  https://www.cnblogs.com/zhao441354231/p/5970544.html   R语言用来存储数据的对象包括: 向量, 因子 ...

  3. Go语言 数据类型,流程控制

    Go语言 数据类型,流程控制 人生苦短,Let's Go ! package main // 必须要有一个main包 import "fmt" func main() { fmt. ...

  4. C语言数据类型_02

    C语言数据类型:

  5. R语言 数据类型

    R语言数据类型 通常,在使用任何编程语言进行编程时,您需要使用各种变量来存储各种信息. 变量只是保留值的存储位置. 这意味着,当你创建一个变量,你必须在内存中保留一些空间来存储它们. 您可能想存储各种 ...

  6. C语言数据类型取值范围

    一.获取数据类型在系统中的位数 在不同的系统中,数据类型的字节数(bytes)不同,位数(bits)也有所不同,那么对应的取值范围也就有了很大的不同,那我们怎么知道你当前的系统中C语言的某个数据类型的 ...

  7. 一:c语言(数据类型和运算符)

    #include <stdio.h> /*就是一条预处理命令,它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作.*/ int main() /*C程序就是执行主函数 ...

  8. -- c语言数据类型总结 --

    C语言中的数据类型总结

  9. 第三课,T语言数据类型(版本TC5.0)

    数据类型 TC综合开发工具里使用的是可变类型,就是在程序执行过程中,TC综合开发工具会自动把数据转换为需要的类型,转换失败会出现相应的提示但是在一些特殊的场景下,是需要做类型强制处理,那么这时就需要使 ...

  10. C语言数据类型

    1.概述 C 语言包含的数据类型如下图所示: 2.各种数据类型介绍 2.1整型 整形包括短整型.整形和长整形. 2.1.1短整形 short a=1; 2.1.2整形 一般占4个字节(32位),最高位 ...

随机推荐

  1. Python函数定义和使用

    函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果.通过使用函数,可以提高代码的重复利用率.本文主要介绍Python函数的定义.调用和函数参数设置方法. 函数的定义 Python函数定 ...

  2. spring的ioc与aop原理

    ioc(反向控制) 原理:    在编码阶段,既没有实例化对象,也没有设置依赖关系,而把它交给Spring,由Spring在运行阶段实例化.组装对象.这种做法颠覆了传统的写代码实例化.组装对象.然后一 ...

  3. 可以作为瘟到死(windows)路径的字符

    !#$%&""()+-0123456789;=@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[]^_`{}~

  4. 微信小程序--动画animation

    js: list:[], contentflag:false   this.animation = wx.createAnimation({ duration: 500, timingFunction ...

  5. Django_Form验证(二),ajax验证

    还是一个简单的html提交页面,ajax提交就不需要form表单了: <p><input id="a" type="text" name=&q ...

  6. linux下配置redis4.0.2主从复制以及高可用

    一.环境 三台服务器分别为: 172.28.18.75/172.28.18.103/172.28.18.104 在三台服务器上分别部署一个redis节点以及一个sentinel节点 二.主从复制配置 ...

  7. rhce 第十一题 挂载NFS共享

    挂载NFS共享 在system2上挂载一个来自 system1.group8.example.com 的NFS共享,并符合下列要求: /public 挂载在/mnt/nfsmount目录上 /prot ...

  8. [leetcode]36. Valid Sudoku验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  9. LinkedList 源码实现

    闲暇之余,准备将Java 一些常用的数据结构进行重新的剖析,并记录博客比如LinkedList ,HashMap ,HashTable ,以及并发包所引入的集合,在博客中会陆续更新 start 哈哈, ...

  10. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...