Go语言基本类型:整型

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

整型分为有符号(signed)或无符号(unsigned)。

有符号整型

有符号整型根据整型所占的空间分为:

类型占用的空间取值范围
int依赖平台依赖平台
int88 bit/1字节-2^7 至 2^7 -1
int1616 bit/2两字节-2^15 至 2^15 -1
int3232 bit/4字节-2^31 至 2^31 -1
int6464 bit/8字节-2^63 至26^3 - 1

int类型所占空间依赖于操作系统,主要分为两种:

  • 在32位的机器上,int占用的空间为32位,即是4字节。
  • 在64位的机器上,int占用的空间位64位,即是8字节。

声明int类型的变量

var i int

声明变量为int时,如果没有显式赋值,其默认值为0。

隐式声明int变量

i := 1
var j = 1

使用整型数值做简短变量声明或者类型推断声明,变量的默认类型时int。可以使用reflect.TypeOf()查看变量的类型:

package main
import (
    "fmt"
    "reflect"
)
func main() {
    i := 2
    fmt.Printf("i的类型时%s\n", reflect.TypeOf(i))
}

查看int类型所占空间

go语言的bits.UintSize和unsafe.Sizeof()都可以用来获取int类型所占用bit大小。

package main

import (
    "fmt"
    "math/bits"
    "unsafe"
)

func main() {
    sizeOfIntInBits := bits.UintSize
    fmt.Printf("%d bit\n", sizeOfIntInBits)
    
    var i int
    fmt.Printf("%d 字节\n", unsafe.Sizeof(i))
}

使用场景

在大多数需要有符号的整型的地方,推荐使用int。以下情况则使用其他类型的整型:

  1. 在32位的机器上,数值超过-2^31到2^31范围时,使用整型int64。在32位机器上,int64是有两个32位的地址构成的。
  2. 数值范围较小时,使用适合的整型类型,如人的年龄,可以使用int8。这种情况下,遵守保小不保大的原则。
  3. 只有在比较大的整型数值才会使用int64类型。例如:time.Duration是int64。

无符号整型

对应于有符号整型,无符号整型分为:

类型占用空间取值范围
uint依赖平台依赖平台
uint88 bit/1字节0 至 2^8 -1
uint1616  bit/2字节0 至 2^16 -1
uint3232  bit/4字节0 至 2^32 -1
uint6464  bit/8字节0 至 2^64 -1
uintptr依赖平台依赖平台

 

uint类型所占空间依赖于操作系统,主要分为两种:

  • 在32位的机器上,uint占用的空间为32位,即是4字节。
  • 在64位的机器上,uint占用的空间位64位,即是8字节。

声明uint类型的变量

var i uint

uint需要显式声明,如果要查看uint类型所占空间,可以使用bits.UintSize和unsafe.Sizeof()。同样,reflect.TypeOf()可以查看变量的类型。

package main

import (
    "fmt"
    "math/bits"
    "reflect"
    "unsafe"
)

func main() {
    sizeOfIntInBits := bits.UintSize
    fmt.Printf("%d bit\n", sizeOfIntInBits)
    
    var i uint
    fmt.Printf("%d 字节\n", unsafe.Sizeof(i))
    fmt.Printf("i的类型是%s\n", reflect.TypeOf(i))
}

uintptr

uintptr也是无符号的整型,它的空间大到足以容纳任何指针地址。因此,其所占空间和范围取决于平台。

  • 在32位的机器上,uint占用的空间为32位,取值范围:-2^31 to 2^31 -1。
  • 在64位的机器上,uint占用的空间位64位,取值范围:-2^63 to 2^63 -1。

特性:

  • uintptr可以和unsafe.Pointer相互转换
  • uintptr和其他整型一样进行数值运算
  • uintptr可以保存一个指针地址,但它只是一个值,并不引用任何对象

使用场景:

  • uintprt和unsafe.Pointer一起使用,用来做非安全的内存访问。
  • 用来保存指针地址用于打印和存储。因为uintprt只是一个值,不引用任何对象,也就是不影响对象的垃圾回收。

示例:

package main

import (
    "fmt"
    "unsafe"
)

type sample struct {
    a int
    b string
}

func main() {
    s := &sample{a: 1, b: "test"}
    
   //获取b在结构体s的地址
    p := unsafe.Pointer(uintptr(unsafe.Pointer(s)) + unsafe.Offsetof(s.b))
}

这里需要说明下,在Go语言中,&表示取地址符号 , 取得某个变量的地址,返回的是变量的指针。 

 

版权声明:著作权归作者所有。

相关推荐

TypeScript:基本类型详解

布尔值(Boolean)TypeScript的布尔值和JavaScript一样有两个值:true和false。类型标识:boolean示例:let isDone: boolean = false; 数字(Number)和JavaScript一样,TypeScript的所有数字都是用浮点数表示,支持二进制,八进制,十进制以及十六进制的表示方式,类型标识:num

Kotlin:基本类型 - 数值

内置数值类型Kotlin和Java的数值类型很接近,内置了6中数值类型:Double:64 Float:32 Long:64 Int:32 Short:16 Byte:8 在Java里,char类型也是一种数值类型,可以和其他数值类型转换,而在Kotlin则没有把char类型作为数值类型。字面量整数整数类型:Shot,Int和Long。和Java一样,Long类型的字面量在数字后面加上L来表示。&

Kotlin:基本类型 - Char与Boolean

字符类型Kotlin使用Char表示字符,与Java不同的是,它并不能直接和数字做类型转换。字符表示它们使用单引号''把字符括起来特殊字符:特殊字符串使用反斜杠开头,如\t, \b, \n, \r, \', \", \\ and \$其他一些字符可以使用Unicode编码,如'\uFF00'数字转换Kotlin的字符不能直接和数字做类型转换,但我们可以它们的unicode码的相对差来做数

Kotlin:基本类型 - 字符串

Kotlin字符串使用String表示类型,为不可变类型。字符串表示字符串有两种表示方式:单行和多行。 单行单行使用双引号把内容括起来。val s = “Hello,World” 如果需要在单行里表示换行的字符串需要对换行符转义val s = “Hello, World \n” 多行多行用来表示原始的字符串,

Python3.4 枚举类型的使用

枚举类型是在Python3.4新增到Python的标准库。创建枚举Python提供了两种方法来创建枚举:基于class语法创建枚举基于Function API创建枚举创建枚举首先要导入Enum类>>> from enum import Enum 基于class语法创建枚举示例>>> from 

MySQL类型隐式转换规则

在MySQL语句里,如果操作符应用于不同的类型的操作数,为了兼容让操作数兼容,MySQL会对操作数做类型转换,有些是自动的隐式转换。“+”号操作符使用“+”号相加的是字符串或字符串和数字,字符串会隐式转换为数字。以数字开头的字符串以数字开头的字符串,它会截取前面的数字字符串,转换为对应的数字。mysql> select '1a' + 1; +-----

Shell脚本boolean类型的使用注意点

推荐使用方式在shell脚本里,推荐按以下方式声明和使用布尔类型。bool=trueif [ "$bool" = true ]; thenif [ "$bool" = "true" ]; thenif [[ "$bool" = true ]]; thenif [[ "$bool" = "true" ]]; thenif [[ "$bool" == true ]]; thenif [[ "$bool

Go语言日志框架logrus封装

logrus在github上是一个star数比较高的go日志框架,简单封装如下:package logimport ( "fmt" "github.com/Sirupsen/logrus" "runtime" "strings")var logger = logrus.New()// 封装logrus.Fieldstype Fields logrus.Fieldsfunc SetLogLevel(

Go语言把map接口转换为google.protobuf.Struct

以下是go语言把map[string]interface{}转换为google.protobuf.Struct:package pbimport ( "fmt" "reflect" st "github.com/golang/protobuf/ptypes/struct")// ToStruct转换map[string]interface{} 为ptypes.Structfunc ToStruct

Go语言:变量的作用域(本地和全局变量)

变量声明的位置Go语言变量声明的位置有三种级别:包(package)级别:变量在函数外声明函数级别:变量在函数内,包括函数的传参参数变量,但在代码块外声明块级别:这个分两种,一种是显式,会使用大括号{}括起来的代码;另一种是隐式,如for,if后的初始化表达式。变量位置示例package main import "fmt" var test = "test" //在函数外,包级别变量 fu