当前位置: 首页 > news >正文

03Go 类型总结

Go 类型总结

[TOC]

1、内置类型和内置函数

内置类型:

类型⻓度默认值说明
bool1false布尔型只有true和false
byte10uint8的别名
rune40Unicode Code Point, int32别名
int, uint4 或 80有符号和无符号证书,根据系统可能32 或 64 位
int8, uint810-128 ~ 127, 0 ~ 255
int16, uint1620-32768 ~ 32767, 0 ~ 65535
int32, uint3240-21亿 ~ 21 亿, 0 ~ 42 亿
int64, uint6480
float3240.0单精度浮点型 ,小数位:精确到7小数位
float6480.0双精度浮点型,小数位:精确到15小数位
complex648 负数
complex12816
uintptr4 或 8nil⾜以存储指针的 uint32 或 uint64 整数
array 数组,值类型
struct 结构体,值类型
string ""UTF-8 字符串
slice nil引⽤类型
map nil引⽤类型
channel nil引⽤类型
interface nil接⼝
function nil函数
error nil错误

内置函数:不需要导入就能使用的函数 (了解即可)

函数说明
append追加元素到slice,返回修改后的slice
close用来关闭channel
delete从map中删除key对应的value
panic用来做错误处理 panic和rcover
recover允许程序定义goroutine的panic动作
imag返回complex的实部,(complex,real imag:操作复数)
real返回complex的虚部
make用来分配内存,返回Type本身(只应用于slice,map,channel)
new用来分配内存,主要用来分配值类型。返回指向Type的指针
cap用于求最大容量,比如array,slice,channel,返回最大容量
copy用于赋值和连接slice,返回复制的数目
len返回长度
print、println底层打印函数,一般用fmt包的打印

2、类型转换

  • Go中不存在隐式转换,所有类型转换必须显式声明
  • 转换只能发生在两种相互兼容的类型之间
  • int(a) 类型(被转换变量)

3、变量

Go语言是静态类型语言,不能在运行期间改变变量类型。使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。

(1)单个变量声明

var x int                    //使用var
var s = "abc"                //省略类型
s:="abc"                    //函数内部可以省略var

(2)多个变量声明

var x, y, z int                //定义多个
var s, n = "abc", 123        //定义多个省略类型
var (                        //多个,多类型
    a int
    b float32
)
//在函数内部,可⽤更简略的 ":=" ⽅式定义变量
a,b:=128,"12" 

(3)多变量赋值时,先计算所有相关值,然后再从左到右依次赋值

data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)

(4)编译器会将未使⽤的局部变量当做错误

(5)注意重新赋值与定义新同名变量的区别。

​ 同一代码块,重新赋值内存地址不变。不同代码块定义同名变量,内存地址不同。

(6)全局变量、局部变量、形参 以及优先级

4、常量

常量值必须是编译期可确定的数字(整型、浮点型、复数)、字符串、布尔值

(1)单个常量声明

const s string = "Hello, World!"
const s="Hello, World!"

(2)多个常量定义

const x, y int = 1, 2 // 多常量初始化
const (             // 常量组
    a, b = 10, 100
    c bool = false
)

(3)在常量组中,如不提供类型和初始化值,那么视作与上⼀常量相同。

const (
    s = "abc"
    x                 // x = "abc"
)

(4)常量值还可以是 len、 cap、 unsafe.Sizeof 等编译期可确定结果的函数返回值

const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(b)
)

(5)未使用的局部常量不会引发编译错误

(6)枚举:关键字 iota 定义常量组中从 0 开始按⾏计数的⾃增枚举值。

  • 从 0 开始按⾏计数的自增
  • 在同⼀常量组中,可以提供多个 iota,它们各⾃增⻓。
  • 如果 iota ⾃增被打断,须显式恢复。
const (
    _ = iota     // iota = 0
    KB int64 = 1 << (10 * iota) // iota = 1
    MB             // 与 KB 表达式相同,但 iota = 2
)
const (            //在同⼀常量组中,可以提供多个 iota,它们各⾃增⻓。
    A, B = iota, iota << 10 // 0, 0 << 10
    C, D         // 1, 1 << 10
)
//如果 iota ⾃增被打断,须显式恢复。
const (
    A = iota // 0
    B // 1
    C = "c" // c
    D // c,与上⼀⾏相同。
    E = iota // 4,显式恢复。注意计数包含了 C、 D 两⾏。
    F // 5
)

5、指针

Go语言支持指针类型*T,指针的指针**T,以及包含包名前缀的*package.T

  • 操作符 "&" 取变量地址, "*" 透过指针访问目标对象。
  • 默认值 nil,没有 NULL 常量。
  • 不⽀持指针运算,不⽀持 "->" 运算符,直接⽤ "." 访问目标成员。

指针声明

var ip *int         //声明一个int值的指针变量
var sp *string        //生成string值的指针变量
var str="hello"
sp:= &str            //:=定义指针
var p **int            //声明指针的指针

类型转换:go语言指针是不允许指针类型转换的。但是unsafe.Pointer可以变相实现运算

unsafe.Pointer类型用于表示任意类型的指针。有4个特殊的只能用于Pointer类型的操作:

1、 任意类型的指针可以转换为一个Pointer类型值
2、 一个Pointer类型值可以转换为任意类型的指针
3、 一个uintptr类型值可以转换为一个Pointer类型值
4、 一个Pointer类型值可以转换为一个uintptr类型值

func main() {
    d := struct {
    s string
    x int
}{"abc", 100}
    p := uintptr(unsafe.Pointer(&d)) // *struct -> Pointer -> uintptr
    p += unsafe.Offsetof(d.x)         // uintptr + offset
    p2 := unsafe.Pointer(p)         // uintptr -> Pointer
    px := (*int)(p2)                 // Pointer -> *int
    *px = 200                         // d.x = 200
    fmt.Printf("%#v\n", d)
}
//输出:
struct { s string; x int }{s:"abc", x:200}

注意: GC 把 uintptr 当成普通整数对象,它⽆法阻⽌ "关联" 对象被回收。

6、字符串

字符串是不可变的值类型,内部用指针指向UTF-8字节数组。

在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。可使用 []byte() 获取字节,使用 []rune() 获取字符,可对中文进行转换。

  • 默认值是空字符串 ""。
  • ⽤索引号访问某字节,如 s[i]。
  • 不能⽤序号获取字节元素指针, &s[i] ⾮法。
  • 不可变类型,⽆法修改字节数组。
  • 字节数组尾部不包含 NULL。

(1)定义字符串

//“abc” 双引号定义字符串 ``  反引号定义非转义字符串,多行
str := `aaaa
            可以跨行`
str:="abc"

(2)+号连接字符串:,"+" 必须在上一行末尾,否则导致编译错误。连接是会产生新的字符串。

​ 当然还有函数连接,这个放到字符串专题总结。如fmt.Sprintf() 等

(3)单引号字符常量

​ 单引号字符常量表⽰ Unicode Code Point,⽀持 uFFFF、 U7FFFFFFF、 xFF 格式。对应 rune 类型, UCS-4。

func main() {
    fmt.Printf("%T\n", 'a')
    var c1, c2 rune = '\u6211', '们'
    println(c1 == '我', string(c2) == "\xe4\xbb\xac")
}
//输出:
int32 // rune 是 int32 的别名
true true

(4)修改字符串

要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。⽆论哪种转换,都会重新分配内存,并复制字节数组。

7、自定义类型和类型别名

可将类型分为命名和未命名两⼤类。命名类型包括 bool、 int、 string 等,⽽ array、slice、 map 等和具体元素类型、⻓度等有关,属于未命名类型。
具有相同声明的未命名类型被视为同⼀类型。

  • 具有相同基类型的指针
  • 具有相同元素类型和⻓度的 array。
  • 具有相同元素类型的 slice。
  • 具有相同键值类型的 map。
  • 具有相同元素类型和传送⽅向的 channel。
  • 具有相同字段序列 (字段名、类型、标签、顺序) 的匿名 struct。
  • 签名相同 (参数和返回值,不包括参数名称) 的 function。
  • ⽅法集相同 (⽅法名、⽅法签名相同,和次序⽆关) 的 interface。

使用type关键字自定义类型:

//可⽤ type 在全局或函数内定义新类型。
func main() {
    type bigint int64
    var x bigint = 100
    println(x)
}

注意:新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系,不会持有原类型任何信息。除⾮目标类型是未命名类型,否则必须显式转换。

相关文章:

  • PHP打印常量
  • Route配置实现通信实验报告
  • 区块链技术特点之去中心化特性
  • SqlBulkCopy类进行大数据(10000万条以上)插入测试
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 【Linux系统编程】快速查找errno错误码信息
  • 关于aspx.designer.cs的研究
  • 精彩代码 vue.js
  • 霍夫变换直线检测
  • Netflix 混沌工程手册 Part 3:实践方法
  • 又一款博客园Android客户端低调推出
  • 基于虹软 人脸识别的闸机开发经验及源码分享
  • python 安装第三方模块
  • ajax与json
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • miaov-React 最佳入门
  • Node + FFmpeg 实现Canvas动画导出视频
  • React-flux杂记
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Web Storage相关
  • 阿里云前端周刊 - 第 26 期
  • 关于extract.autodesk.io的一些说明
  • 排序算法之--选择排序
  • 日剧·日综资源集合(建议收藏)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 用Python写一份独特的元宵节祝福
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $L^p$ 调和函数恒为零
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (3)llvm ir转换过程
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • .gitignore文件—git忽略文件
  • .htaccess 强制https 单独排除某个目录
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 反射的使用
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net的socket示例
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • @Autowired和@Resource装配
  • @DataRedisTest测试redis从未如此丝滑
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [2016.7 test.5] T1
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]使用Git将项目提交到GitHub
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析
  • [iOS开发]iOS中TabBar中间按钮凸起的实现
  • [Jquery] 实现温度计动画效果