新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、基本数据类型
创新互联是一家专业提供洛川企业网站建设,专注与成都网站设计、网站建设、成都h5网站建设、小程序制作等业务。10年已为洛川众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // alias for int8
rune // alias for int32,represents a Unicode code point
float32 float64
complex64 complex128
常量定义
2、类型转换
(1)Go语言不允许隐式类型转换(不支持小位数类型向大位数类型转)
(2)别名和原有类型也不能进行隐式类型转换(type MyInt int64 = int64)
3、类型的预定义值
1.math.MaxInt64
2.math.MaxFloat64
3.math.MaxUInt32
4、指针类型
(1)不支持指针运算
(2)string是值类型,其默认的初始化值为空字符串,而不是nil
5、算术运算符
+ - * / % ++ --(不支持前置++ --)
6、比较运算符
#== != = =
(1)比较数组
相同维数且含有形同个数元素的数组才可以比较
每个元素都相同的才相等
7、位运算符
| ^
^ (按位置零) a (^b)
1 ^ 0 1
1 ^ 1 0
0 ^ 1 0
0 ^ 0 0
8、条件与循环
(1)循环
Go 语⾔仅⽀持循环关键字 for
(2)条件
9、数组和切片
数组截取,索引下标从0开始计数
a[开始索引(包含), 结束索引(不包含)]
a := [...]int{1, 2, 3, 4, 5}
a[1:2] //2
a[1:3] //2,3
a[1:len(a)] //2,3,4,5
a[1:] //2,3,4,5
a[:3] //1,2,3
切片内部结构
9、Map
9、字符串
Unicode UTF8
常⽤字符串函数
作为C语言家族的一员,go和c一样也支持结构体。可以类比于java的一个POJO。
在学习定义结构体之前,先学习下定义一个新类型。
新类型 T1 是基于 Go 原生类型 int 定义的新自定义类型,而新类型 T2 则是 基于刚刚定义的类型 T1,定义的新类型。
这里要引入一个底层类型的概念。
如果一个新类型是基于某个 Go 原生类型定义的, 那么我们就叫 Go 原生类型为新类型的底层类型
在上面的例子中,int就是T1的底层类型。
但是T1不是T2的底层类型,只有原生类型才可以作为底层类型,所以T2的底层类型还是int
底层类型是很重要的,因为对两个变量进行显式的类型转换,只有底层类型相同的变量间才能相互转换。底层类型是判断两个类型本质上是否相同的根本。
这种类型定义方式通常用在 项目的渐进式重构,还有对已有包的二次封装方面
类型别名表示新类型和原类型完全等价,实际上就是同一种类型。只不过名字不同而已。
一般我们都是定义一个有名的结构体。
字段名的大小写决定了字段是否包外可用。只有大写的字段可以被包外引用。
还有一个点提一下
如果换行来写
Age: 66,后面这个都好不能省略
还有一个点,观察e3的赋值
new返回的是一个指针。然后指针可以直接点号赋值。这说明go默认进行了取值操作
e3.Age 等价于 (*e3).Age
如上定义了一个空的结构体Empty。打印了元素e的内存大小是0。
有什么用呢?
基于空结构体类型内存零开销这样的特性,我们在日常 Go 开发中会经常使用空 结构体类型元素,作为一种“事件”信息进行 Goroutine 之间的通信
这种以空结构体为元素类建立的 channel,是目前能实现的、内存占用最小的 Goroutine 间通信方式。
这种形式需要说的是几个语法糖。
语法糖1:
对于结构体字段,可以省略字段名,只写结构体名。默认字段名就是结构体名
这种方式称为 嵌入字段
语法糖2:
如果是以嵌入字段形式写的结构体
可以省略嵌入的Reader字段,而直接访问ReaderName
此时book是一个各个属性全是对应类型零值的一个实例。不是nil。这种情况在Go中称为零值可用。不像java会导致npe
结构体定义时可以在字段后面追加标签说明。
tag的格式为反单引号
tag的作用是可以使用[反射]来检视字段的标签信息。
具体的作用还要看使用的场景。
比如这里的tag是为了帮助 encoding/json 标准包在解析对象时可以利用的规则。比如omitempty表示该字段没有值就不打印出来。
import "workname/packetfolder"
导入多个包
方法调用 包名.函数//不是函数或结构体所处文件或文件夹名
packagename.Func()
前面加个点表示省略调用,那么调用该模块里面的函数,可以不用写模块名称了:
当导入一个包时,该包下的文件里所有init()函数都会被执行,然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。下划线的作用仅仅是为了调用init()函数,所以无法通过包名来调用包中的其他函数
import _ package
变量声明必须要使用否则会报错。
全局变量运行声明但不使用。
func 函数名 (参数1,参数2,...) (返回值a 类型a, 返回值b 类型b,...)
func 函数名 (参数1,参数2,...) (返回值类型1, 返回值类型2,...)
func (this *结构体名) 函数名(参数 string) (返回值类型1, 返回值类型2){}
使用大小来区分函数可见性
大写是public类型
小写是private类型
func prifunc int{}
func pubfunc int{}
声明静态变量
const value int
定义变量
var value int
声明一般类型、接口和结构体
声明函数
func function () int{}
go里面所有的空值对应如下
通道类型
内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针
func new(Type) *Type
[这位博主有非常详细的分析]
Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。
同一个程序中的所有 goroutine 共享同一个地址空间。
语法格式如下:
通道(channel)是用来传递数据的一个数据结构。
通道的声明
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 - 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
[这里有比较详细的用例]
go里面的空接口可以指代任何类型(无论是变量还是函数)
声明空接口
go里面的的强制类型转换语法为:
int(data)
如果是接口类型的强制转成其他类型的语法为:
go里面的强制转换是将值复制过去,所以在数据量的时候有比较高的运行代价
go语言是强类型的,没有直接的强制类型转换。但是可以使用unsafe.Pointer来进行强制类型转换(*int64)(unsafe.Pointer(x))