正文
go语言算法与数据结构 go语言基本数据类型
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
go语言语法(基础语法篇)
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语言和其他语言的不同之基本语法
Go语言作为出现比较晚go语言算法与数据结构的一门编程语言,在其原生支持高并发、云原生等领域的优秀表现,像目前比较流行的容器编排技术Kubernetes、容器技术Docker都是用Go语言写的,像Java等其go语言算法与数据结构他面向对象的语言,虽然也能做云原生相关的开发,但是支持的程度远没有Go语言高,凭借其语言特性和简单的编程方式,弥补go语言算法与数据结构了其他编程语言一定程度上的不足,一度成为一个热门的编程语言。
最近在学习Go语言,我之前使用过C#、Java等面向对象编程的语言,发现其中有很多的编程方式和其他语言有区别的地方,好记性不如烂笔头,总结一下,和其他语言做个对比。这里只总结差异的地方,具体的语法不做详细的介绍。
种一棵树最好的时间是十年前,其次是现在。
3)变量初始化时候可以和其他语言一样直接在变量后面加等号,等号后面为要初始化的值,也可以使用变量名:=变量值的简单方式
3)变量赋值 Go语言的变量赋值和多数语言一致,但是Go语言提供了多重赋值的功能,比如下面这个交换i、j变量的语句:
在不支持多重赋值的语言中,交换两个变量的值需要引入一个中间变量:
4)匿名变量
在使用其他语言时,有时候要获取一个值,却因为该函数返回多个值而不得不定义很多没有的变量,Go语言可以借助多重返回值和匿名变量来避免这种写法,使代码看起来更优雅。
假如GetName()函数返回3个值,分别是firstName,lastName和nickName
若指向获得nickName,则函数调用可以这样写
这种写法可以让代码更清晰,从而大幅降低沟通的复杂度和维护的难度。
1)基本常量
常量使用关键字const 定义,可以限定常量类型,但不是必须的,如果没有定义常量的类型,是无类型常量
2)预定义常量
Go语言预定义了这些常量 true、false和iota
iota比较特殊,可以被任务是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前每出现一个iota,其所代表的数字会自动加1.
3)枚举
1)int 和int32在Go语言中被认为是两种不同类型的类型
2)Go语言定义了两个浮点型float32和float64,其中前者等价于C语言的float类型,后者等价于C语言的double类型
3)go语言支持复数类型
复数实际上是由两个实数(在计算机中使用浮点数表示)构成,一个表示实部(real)、一个表示虚部(imag)。也就是数学上的那个复数
复数的表示
实部与虚部
对于一个复数z=complex(x,y),就可以通过Go语言内置函数real(z)获得该复数的实部,也就是x,通过imag(z)获得该复数的虚部,也就是y
4)数组(值类型,长度在定义后无法再次修改,每次传递都将产生一个副本。)
5)数组切片(slice)
数组切片(slice)弥补了数组的不足,其数据结构可以抽象为以下三个变量:
6)Map 在go语言中Map不需要引入任何库,使用很方便
Go循环语句只支持for关键字,不支持while和do-while
goto语句的语义非常简单,就是跳转到本函数内的某个标签
今天就介绍到这里,以后我会在总结Go语言在其他方面比如并发编程、面向对象、网络编程等方面的不同及使用方法。希望对大家有所帮助。
Go数据结构篇
1、基本数据类型
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
常⽤字符串函数
为什么要使用 Go 语言?Go 语言的优势在哪里
1. 保留但大幅度简化指针
Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
2. 多参数返回
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。
3. Array,slice,map等内置基本数据结构
如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。
4. Interface
Go语言最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。
同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的type assertion,可以提供一般动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。
5. OO
Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中, 你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是普通的struct操作。
6. Goroutine
这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlang spawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的内存模型是必须要懂的。不过请放心,真的非常简单。
7. 更多现代的特性
和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language类似), function是first class object,等等等等。
看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。
go语言算法与数据结构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言基本数据类型、go语言算法与数据结构的信息别忘了在本站进行查找喔。