首页 > 其他分享 >0x04 Go 数据类型

0x04 Go 数据类型

时间:2023-06-12 10:34:13浏览次数:27  
标签:string 0x04 数据类型 var 类型 int Go

  • 基本数据类型

    1. 数值类型:int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64

    2. 字符类型:在 Go 中没有类似 Java 中的 char 类型,但是可以通过 byte 来保存单个字母字符。int 系列类型也可以保存字符

      var ni int16 = '你'
      var a int8 = 'a'
      var b byte = 'b'
      
    3. 浮点类型:float32 float64

    4. 布尔类型:bool

    5. 字符串:string 与其它语言不同的是,字符串在 Go 中被作为基本数据类型

    6. 结构体(struct)

    7. 数组

  • 派生/复杂数据类型/引用数据类型

    1. 指针 (Pointer)
    2. 数组
    3. 结构体 (struct)
    4. 管道 (Channel)
    5. 函数
    6. 切片
    7. 接口
    8. map

整数类型

类型 有无符号 存储空间 数据范围 备注
int8 1字节 -128 ~ 127
int16 2字节 -2^15 ~ 2^15 - 1
int32 4字节 -2^31 ~ 2^31 - 1
int64 8字节 -2^63 ~ 2^63 - 1
uint8 1字节 0 ~ 255
uint16 2字节 0 ~ 2^16 - 1
uint32 4字节 0 ~ 2^32 - 1
unit64 8字节 0 ~ 2^64 - 1
int 计算机最大支持位数 -2^31 ~ 2^31 - 1
-2^63 ~ 2^63 - 1
如果当前计算机支持64位,那么他就是64。如果计算机是32位,那么他就是32
uint 计算机最大支持位数 0 ~ 2^32 - 1
0 ~ 2^64 - 1
rune 4字节 -2^31 ~ 2^31 - 1 int32 类似,表示一个 Unicode
byte 1字节 0 ~ 255 在需要存储字符时可以使用它

浮点类型

浮点型也被叫做小数类型,例如:1.1、0.1...
在初始化时若不指定变量类型,float 默认声明为 float64

类型 存储空间 表数范围
单精度 float32 4字节 -3.403E38 ~ 3.403E38
双精度 float64 8字节 -1.798E308 ~ 1.798E308

浮点数在机器中存放形式为:符号位 + 指数位 + 尾数位
注意:浮点数在存储过程中可能会有精度丢失问题,跟金钱相关的数值,一定要记住并解决,不应该使用浮点

字符类型

在 Go 语言中,没有专门的字符类型(类似 Java 中的 char ),如果要存储单个字符,一般使用 byte 来保存。
大多数语言字符串是一串固定长度的字符连接起来的字符序列。Go 的字符串不同,它是由字节组成的。通过单引号来表示一个字符。

var one byte = '1'
var a byte = 'a'
println(one, a)

上面的代码在执行之后,输出的值并不是我们期望的 1a ,这是因为它保存的是对应的 ASCII 码

# clover @ MacBook-Pro in ~/dev/go/test-gin [22:56:15] C:1
$ go run main.go
 49 97

如果我们的字符是一个汉字,那么程序会出错,因为 byte 最大范围是 0 ~ 255,汉字对应的码值远大于它。所以只要我们使用更大字节的类型就可以存储汉字字符

var you rune = '你' // int16 也可以

在某种情况下,我们可以通过 unsafe.Sizeof(xx) 方法来查看一个变量所占用的字节数大小。

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

如果需要输出中文,那么可以使用格式化输出,注意 %c 是把一个 Unicode 编码转为中文。

var you rune = '你'
fmt.Printf("%c", you)
var char = fmt.Sprintf("%c", you)
println("char =", char)
  • 字符是通过单引号 '' 括起来的单个字符,例如: var a byte = 'a'
  • Go 中允许使用转译字符 \ 来将其后的字符转译为特殊字符
  • Go 语言的字符使用 UTF-8 编码,英文占用1个字节,中文2个字节
  • Go 中字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的值。
  • 可以直接给某一个变量绑定一个数字,然后通过格式化输出 %c ,会将输出的数字转为对应的 Unicode 字符
  • 字符类型是可以进行运算的,因为在 Go 中字符是被单做整数。

布尔类型

  • 布尔类型也叫做 bool 类型,bool 类型数据只允许取值 truefalse
  • bool 类型占用 1 个字节
  • boolean(bool) 类型适用于逻辑运算,一般用于程序流程控制
var boolean bool = false

字符串类型

  • 在 Go 语言中,字符串被作为基本数据类型,并且默认使用 UTF-8 编码来进行处理。
  • 字符串一旦赋值之后就不允许再次更改,在 Go 中,字符串是不可变的
  • 字符串的两种表示形式
    1. 双引号会识别转译字符,例如 \n \"
    2. 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
      以下内容会被原文输出
      	var str string = `
         package main
      
         import "fmt"
      
         func main() {
           var you rune = '你'
           fmt.Printf("%c", you)
           var char = fmt.Sprintf("%c", you)
           println("char =", char)
      
           var str string = "\n"
         }
       `
       fmt.Println(str)
      
  • 字符串允许使用符号 ++= 进行拼接
    var hello = "hello" + " world"
    hello += "!"
      fmt.Println(hello)
    
    有一点需要注意的是,当拼接多行字符串需要换行时,符号 + 不允许换行,而是保留在当前行。
    var str =  "hello" + " world" 
       +  "hello" + " world" // 这是不允许的
       
    var str1 =  "hello" + " world" +
      "hello" + " world" // 这是正确的
    

基本数据类型的默认值

在 Go 中,数据类型都有一个默认值,当一个类型没有赋值时就会保留默认值,在 Go 中默认值又叫零值

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

基本数据类型的转换

在 Go 语言中,不同数据类型的变量之间赋值时需要显示转换,也就是说 Golang 中数据类型不能像 Java 一样可以自动转换。它的基本语法为 T(v) ,将值v转为类型 T

var age int16 = 1
var age1 int32 = int32(age)

Go 中支持小类型转大类型,也支持大类型转小类型。但是注意,大类型转小类型,可能会出现精度问题

string 和其他基本数据类型的相互转换

在我们日常开发中,经常需要将 string 数据类型转成其他数据类型,例如 int。或者将其他基本类型转成 string

其它基本数据类型转 string

可以使用 fmt 包提供的 SprintfSprint 方法将其他类型转为 string

var age int = 20
var ageStr = fmt.Sprint(age)
println(ageStr)

Go 也提供了相应的类型转换包 strconv,调用它里面的一些函数就可以将指定的类型转为字符串

func FormatBool(b bool) string
func FormatComplex(c complex128, fmt byte, prec, bitSize int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string

参数 base 表示需要转成几进制的字符串,如果需要转 10 进制,base 设置为 10 就可以:

var age int64 = 20
var ageStr = strconv.FormatInt(age, 10) // 输出20

同时也可以使用 Itoa 方法对 int 进行转换,它底层默认调用 FormatInt 并且 base 为 10

string 装其它基本数据类型

可以使用 strconv 包下的这些函数将一个字符串转为指定的基本数据类型。

func ParseBool(str string) (bool, error)
func ParseComplex(s string, bitSize int) (complex128, error)
func ParseFloat(s string, bitSize int) (float64, error)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)

假设将一个 string 转为 int

var age int64 = strconv.ParseInt("20", 10, 64)

这些 parse 方法需要3个参数,s 参数是指定转换的值,base 是表示这个值是几进制的。bitSize 是限制这个值是否大于指定的位数,支持 0、8、16、32、64 。如果给定的数大于 bitSize,那么会抛出一个错误。

在将 string 类型转为其它基本类型时,需要确保 string 类型是一个有效的数字字符串,否则转换失败。例如以下代码,hello 明显不是一个数字字符串。

strconv.ParseInt("hello", 10, 64)

基本数据类型和引用数据类型

  1. 基本数据类型变量直接存储值,内存通常是分配在栈区

    var num = 100
    

    基本数据类型内存图

  2. 引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储对应的值,内存通常在堆上分配。当没有任何变量引用这个地址时,该地址对应的空间就会成为一个垃圾,等待GC进行回收。
    引用类型内存图

标签:string,0x04,数据类型,var,类型,int,Go
From: https://www.cnblogs.com/CloverYou/p/17474264.html

相关文章

  • 0x00 Hello Go
    GO程序的基本结构Go语言的文件后缀是.go结尾,例如hello.goGo项目的文件目录通常是这样的:.└──src└──go_code└──learn项目名└──package1└──package2以下代码是一个helloworld程序的代码示例/***he......
  • django views 序列化
      RESTframework中的序列化类与Django的Form和ModelForm类非常相似。我们提供了一个Serializer类,它提供了一种强大的通用方法来控制响应的输出,以及一个ModelSerializer类,它为创建处理模型实例和查询集的序列化提供了有效的快捷方式。Serializers 序列化器允许把像查询......
  • 基于Go的缓存实现
    概念缓存是计算机科学中的一个重要概念。设想某个组件需要访问外部资源,它向外部源请求资源,接收并使用资源,这些步骤都需要花费时间。当组件再次需要资源时,可以再次请求资源,但这种方式从时间上考虑是比较低效的。相反,组件可以将请求结果保存在本地某处,然后再次使用,使用本地数据总是比......
  • Golang 应用脚手架
    Nunu提供了全面的文档和示例,帮助你快速入门。它还包括一套测试套件,确保你的应用程序按预期工作。安装要求要使用Nunu,你需要在系统上安装以下软件:Golang1.16或更高版本GitMySQL5.7或更高版本(可选)Redis(可选)安装你可以通过一行命令安装Nunu:1goinstall......
  • 【python基础】复杂数据类型-字典(增删改查)
    1.初识字典字典,是另外一种复杂的数据类型,相较于列表,字典可以将相关信息关联起来。比如说一个人的信息有名字、年龄、性别等,如果用列表存储的话,不能表示他们之间是相关联的,而字典可以,字典是一个或多个键值对组成列表的标志是[],字典的标志是{},其语法格式:{键1:值1,键2:值2,,,,,,......
  • C#常见数据类型
    在C#中,有以下常见的数据类型:值类型(ValueTypes):整数类型:int,long,short,byte,sbyte,uint,ulong,ushort浮点类型:float,double字符类型:char布尔类型:bool十进制类型:decimal引用类型(ReferenceTypes):字符串类型:string数组类型:int[],string[],等等类类型:自定......
  • 解决gorm安装报错
    报错:go:modulegrom.io/gorm:Get"https://proxy.golang.org/grom.io/gorm/@v/list":dialtcp142.251.43.17:443:connectex:Aconnectionattemptfailedbecausetheconnectedpartydidnotproperlyrespondafteraperiodoftime,orestablishedconn......
  • VBA中数据类型
    VBA中的数据类型主要分为三大类,一个是数字类型,一个是非数字类型,一个是通用类型。......
  • js:typeof和Object.prototype.toString检测数据类型
    (目录)typeof检测数据类型console.log(typeof100);//"number"console.log(typeof"abc");//"string"console.log(typeoffalse);//"boolean"console.log(typeofundefined);//"undefined"console.log(typeoffunction......
  • Django学习之路
    Django学习之路基于Jason的视频,收益匪浅.谢谢Jason的教诲.1、Django前戏2、Django基础3、Django路由层4、Django视图层......