值类型:

int/uint :根据系统确定是32还是64位。此外还有int8/uint8、int16/uint16、int32/uint32、int64/uint64

byte:字节型,相当于uint8。

float:go语言中没有double型,因为已经有了float32/float64,分别精确到小数点后面7、15位。

uintptr:保存32bit或64bit指针,应该是保存指针的地址

数组array:

数组是有类型的,比如var a [10]int= [10]int{1},a的类型为[10]int。

数组之间可以比较相等==或者不相等(!=),前提是类型相同。如果数组间类型相同且内容依次都一致,那么两个数组相等;如果两个数组类型相同,内容不一致,那么数组不相等。

数组间赋值是值拷贝,会拷贝整个数组的所有元素给另一个数组,而不是引用拷贝,这点和C很不一样!!!

string

有地方说string是不可变的。这里要从string的内部结构说起:

 type StringHeader struct {
Data uintptr
Len int
}

string内部是一个指向某块内存的指针,加上内存块的长度。这里说的string不可变指的是uintptr指向的内存块的内容不可变,但是其指向可以变,用C语言描述一下就是:

const T *uintptr;

struct

struct是值类型。struct的声明和初始化如下:

     type Person struct {
Name string
Age int
}//struct声明 a := Person{
Age: 1,
Name: "hao",
}//直接初始化赋值,每个赋值语句后面要有逗号 b := Person{} //空结构体

go语言中没有继承的概念,只有组合的概念,下面是个小例子:

 type Person struct {
Name string
Age int
} type teacher struct {
Person
field string
} type student struct {
Person
score int
} func main() {
a := student{
score: 100,
Person: Person{"guhao", 18},
}
fmt.Println(a)
}

struct中的method

go没有class,只有struct。但是struct中提供了method方法,但不支持重载。写法与函数类似,这样一个struct就和method绑定了起来。method可以访问struct的所有字段,事实上go语言struct字段的可见性是针对真个package而言的。

 type A struct {
Name string
} type B struct {
Name string
} func main() {
a := A{
Name: "gu",
}
a.Print("hao")
} func (a A) Print(arg string) { //(a A)表示接收者,arg代表方法的参数
fmt.Println(a.Name, arg)
}

基础类型起别名

go语言中可以给基础类型起别名,类似于C语言一样。下面的例子是给int起了个别名TZ,然后给这个别名绑定了print方法:

 type TZ int

 func (a *TZ) print() {
fmt.Println("TZ:", *a)
}
func main() {
var a TZ = 100
a.print() var b int
b = a //错误
b.print() //错误
}

虽然TZ是int的别名,但两者不能直接赋值,需要显式的类型强制转换。go语言将这两者视为不同的类型。

 var b int = 99
a = TZ(b)
a.print()

引用类型:

引用类型有三种:slice\map和channel

slice

slice其实是一个结构体,其中包含了指向底层数组的指针、长度、容量。所以改变slice的值也会改变对应的指向的底层数组。

slice不支持==,或者!=

map

map内部实现是hashtable, 定义如下m:=make(map[int]string),每一级map需要单独初始化,否则直接用对二级map赋值会报错,而且是运行时候的错误,编译时无法发现。

 func main() {
m := make(map[int]map[int]string)
a, ok := m[2][1]
if !ok {
m[2] = make(map[int]string)
}
a = "A"
fmt.Println(a, ok)
}

此外,map是引用类型,需要用make定义。而且map自动扩容,我需要学习。map的key必须支持==和!=操作(废话,不然怎么做通过key去查找)。

channel

接口类型

interface

函数类型

func:函数也是一种类型,因为go语言的函数可以赋值给变量。不支持嵌套,重载和默认参数。支持closure。

 func closure(x int) func(int) int {
fmt.Printf("%p\n", &x)
return func(y int) int {
fmt.Printf("%p\n", &x)
return x + y
}
} func main() {
x := 1
fc := closure(x)
fc(100)
fc(200)
}

我打印了三次调用的x的地址,打印的结果显示三次调用用到的x的值都是一样的,所以闭包对的x不是值拷贝,而是引用(应该是为了节约空间)。

defer语句

go语言特有的,执行顺序和定义顺序相反,先定义的语句后执行。

此外还支持panic和recover

panic和recover

 func A() {
fmt.Println("A")
} func B() {
defer func() {
if err := recover(); err != nil {
fmt.Println("recover in B")
}
}()
panic("Panic in B")
} func C() {
fmt.Println("C")
} func main() {
A()
B()
C()
}

panic会导致程序中断,执行完了panic之后就不执行其他语句了,除非我们在panic执行前先注册了defer语句。因此recover登场了。recover必须和defer一起使用。可以帮助程序恢复执行。以上代码执行结构如下:

类型转换只能显式转换,不能隐式转换

 var a int =
var f float32 = float32(a)

 枚举类型

枚举类型必须定义在const块内.

1、const块内默认下一条使用上一条语句

2、枚举值与iota出现的次数无关,与出现的位置有关:iota出现的位置代表了其值,默认从0开始。

 const (
a = 'A'
b
c
d = iota
e = 'B'
f = iota
g
) func main() {
fmt.Println(a) //输出65
fmt.Println(b) //输出65
fmt.Println(c) //输出65
fmt.Println(d) //输出3
fmt.Println(e) //输出66
fmt.Println(f) //输出5
fmt.Println(g) //输出6
}

运算符

有算术运算符和逻辑运算符、位运算符,写法和C语言一致。

多了一个专门为channel准备的运算符<-

A

recover in B

C

new和make

new返回的是指针,不会初始化变量,只是把新申请的空间内容值为零。用C语言写类似下面:

 T *obj=(T*)malloc(sizeof(T));
memset(obj, , sizeof(T));

但并不是很准确,因为go语言中不同变量类型的零值不一样,比如bool的零值为false,int为零值为0,string的零值为空串,指针的零值是nil。所以下面这段代码p==nil

var p *[]int = new([]int) 

内建函数make(T, args)与new(T)的用途不一样。它只用来创建slice,map和channel,并且返回一个初始化的(而不是置零),类型为T的值(而不是*T)。之所以有所不同,是因为这三个类型的背后引用了使用前必须初始化的数据结构。例如,slice是一个三元描述符,包含一个指向数据(在数组中)的指针,长度,以及容量,在这些项被初始化之前,slice都是nil的。对于slice,map和channel,make初始化这些内部数据结构,并准备好可用的值。

内存管理

特别值得注意的是,局部变量不是所有的都分配在stack中(new出来的对象当然在heap上),如果一个函数的局部变量返回后依然被使用,那么这个变量分配在heap上,而不是stack上。

go语言学习(基本数据类型)的更多相关文章

  1. Go语言学习之数据类型

    ### Go语言学习之数据类型 数据类型的转换 1.Go语言不允许隐式类型转换(显示转换才可以) 2.别名和原有类型也不能进行隐式类型转换 例子: func TestImplicit(t *testi ...

  2. python语言学习7——数据类型和变量

    整数 python可以处理任意大小的整数,包括负整数,在程序中的表示方法和数学上的写法一样 计算机由于使用二进制,有时候采用十六进制表示整数比较方便,十六进制数用0x前缀 浮点数 简单的小数就直接用小 ...

  3. GO语言学习——基本数据类型——整型、浮点型、复数、布尔值、fmt占位符

    基本数据类型 整型 整型分为以下两个大类: 按长度分为:int8.int16.int32.int64 对应的无符号整型:uint8.uint16.uint32.uint64 其中,uint8就是我们熟 ...

  4. GO语言学习——基本数据类型字符串

    字符串 Go语言中的字符串以原生数据类型出现. Go 语言里的字符串的内部实现使用UTF-8编码. 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 GO语 ...

  5. C语言学习关于数据类型的一些知识点(初学者)

    1.整型常量的的前缀:(1)十进制常数无前缀. (2)八进制常数前缀为0,八进制常数无符号. (3)十六进制常数前缀为0X或0x. 注:在程序中是根据前缀来区分各种进制数的.因此在书写常数时不要把前缀 ...

  6. Go语言学习之数据类型以及类型转换(The way to go)

    生命不止,继续go go go 介绍来go中的变量和常量,今天介绍一下go中的基本类型. 可以分为四大类,现在一点点道来. Boolean Types 布尔类型,不用过多介绍来吧,就是true和fal ...

  7. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

  10. c语言学习之基础知识点介绍(一):输出语句和变量简单介绍

    本系列是为了学习ios做准备的,也能作为c语言入门的教程看看. c语言的程序结构: 1.顺序结构:自上而下依次执行. 2.分支结构:程序有选择的执行某段代码或者不执行某段代码. 3.循环结构:程序循环 ...

随机推荐

  1. Spring Boot中一个Servlet主动断开连接的方法

    主动断开连接,从而返回结果给客户端,并且能够继续执行剩余代码. 对于一个HttpServletResponse类型的对象response来说,执行如下代码: response.getWriter(). ...

  2. iOS-UIToolbar与UISearchBar

    组件_ UIToolbar  /** 1. 顶部toolbar 2. TextField可以以UIBarButtonItem的自定义视图的方式加入toolbar 3. 三个按钮 4. 将UIBarBu ...

  3. Kali之Metasploit生成apk后门控制安卓

    扫盲教程,大佬勿喷. 实验中请更改为你环境的IP. 生成apk后门 Kali Linux(Hack):192.168.169.76 Android(靶机):192.168.169.137 启动kali ...

  4. 区块链学习(四)truffle部署编译智能合约以太坊私有链

    前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04  Truf ...

  5. Android SDK目录说明

    在SDK目录下有很多文件夹,了解这个文件夹都包含哪些内容,更有利于Android的开发,也是作为Android开发者应该了解的.本文就SDK目录进行说明. SDK目录如下: add-ones:Goog ...

  6. IdentityServer4学习笔记汇总(实现传送门在底部)

    前言 互联网时代,对信息和资源的保护越发苛刻,在所有应用中授权和认证是必不可少缺少的一部分.如果一个应用没有授权和认证那么这个应用就是不完整或者说不安全的应用.在.Net平台给我们提供了一套完整的授权 ...

  7. 创建Webpack 4.X项目

    创建基本的webpack4.x项目 运行npm init -y 快速初始化项目 在项目根目录创建src源代码目录和dist产品目录 在 src 目录下创建 index.html 使用 cnpm 安装 ...

  8. 学习笔记:oracle之win10安装卸载oracle 11gR2步骤及常见问题解决

    1.win10下安装oracle11g 1.1 工具原料 oracle11g安装包(64位) 1.2 步骤方法 1.在Oracle官网下载安装包,下载后,得到的文件如图所示: 2.将两个文件进行解压缩 ...

  9. [转帖]阿里云VS腾讯云 谁才是中国未来的云计算之王?

    阿里云VS腾讯云 谁才是中国未来的云计算之王? https://www.qianzhan.com/analyst/detail/220/191008-f05009f6.html 吴小燕• 2019-1 ...

  10. K8S从入门到放弃系列-(10)kubernetes集群之kube-proxy部署

    摘要: kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问 新版本目前 kube-proxy ...