社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
惯例书名放在最上面《go语言高并发与微服务实战》
开始基础语法和关键字之前,上一篇遗留了几个问题:
go语言debug之Gdb Version,之前没用过C++和C,所以对于Gdb不是很熟悉,也不想特别麻烦去搞,于是想偷个懒,利用网上的方法,去下载liteidex,准备利用里面的gdb64.exe,但下载了最新版,里面没有gdb的可执行文件。但是通过liteIde发现了另外一个调试工具Delve,但是实际运行,本机的go语言版本太高,delve版本太低,空欢喜一场。于是去下载老板本的liteidex希望能在老版本里找到gdb64.exe
黄天不负有心人,终于让我找到了,接下来就是配置gdb了
配置完毕,满心欢喜
xxx.exe not in executable format: Invalid operation。
好吧,这个问题我就不擅长定位了,于是只好问baidu,结果baidu有一次告诉我,我不知道。好吧,我也没打算深入研究。放一放吧。后面回来再解决他。继续把这个归入遗留问题。我初步怀疑不像编译格式问题,有点儿可能我本机c版本的问题,因为我的eclipse之前是配置了PHP,没有用CDT那个,是不是缺少基础类库。后边继续研究吧。(有经验的可以私信我,省的我再去研究了)
那么进入正题,go语言基础语法和关键字。上一篇 其实有一个关键字是func用来声明函数。
通过var关键字声明变量。
变量声明的基本格式:var 变量名 数据类型 (数据类型在后)
另外还可以通过 var(变量名1 数据类型 变量名2 数据类型....)来同时声明一组变量。
**Go语言规定每一个声明的变量都必须被使用,否则编译不过。**
声明变量时,会自动把变量对应的内存区域初始化。
变量赋值Go语言和其他语言没什么差别,都通过“=”进行赋值,但Go语言本身具有强大的类型推导机制,编译器会尝试根据等号右边的表达式推导出变量的类型。
同时Go语言提供了段变量声明格式“:=”,
var a=100
b:="hello"
****":="运算符不能出现在全局变量和初始化中。同时左值中的变量最少有一个变量必须是未定义过的变量**************
和C语言相比,除了类型推导特性,Go语言还提供了多重赋值和匿名变量的语法糖特性。
比如交换a,b两个变量的值
var a int =1
var b int=2
b,a=a,b
在多重赋值中,变量的左值和右值按照从左到右的顺序赋值。有些时候我们不需要使用某些左值,可以使用匿名变量处理。通过在不需要的变量声明的地方使用“_”代替变量名,我们就可以忽略部分不需要的左值,匿名变量不占用命名空间。不会分配内存。
数据类型各个语言都大同小异,这里只列举Go 语言的一些特性。
1.Go语言的布尔型不可与整型进行强制类型转换,并且无法参与数值运算
2.G语言中的字符串是原生数据类型,基于UTF-8编码实现,所以使用byte进行字符串遍历时,要注意汉字在utf-8中占3个字节,如果要统计字符个数,可以使用uft8.RuneCountInString()方法。
3.为了规避C语言指针编程造成的指针便宜,内存释放可能引发的错误,Go语言限制了指针类型的偏移和运算能力。使得指针类型具备高效访问的特性,但又不会发生指针偏移。Go语言中提供的自动垃圾回收机制,也减少了对指针占用内存回收的复杂性。
4.除了大家熟悉的“&”地址符职位,Go语言可以通过new函数直接分配内存,并返回指向内存的指针。
1.通过const关键字可以声明常量。声明常量的样式与声明变量非常相似.
2.可以通过type name=T,来定义类型别名。这样声明变量的时候可以用类型别名,但变量的实际类型不会变化。也可以通过type name T来声明一种新类型,,新类型原类型的特性
1.Go语言中规定与if匹配的“{”必须和表达式位于同一行,同样的,else也必须与上一个分支的“}“位于同一行,表达式两边可以省略();
2.Switch语句不需要break关键之跳出当前分支,如果需要执行接下来的case判断,需要提价fallthrough关键字对两个case进行连接。另外Go语言,Switch还能对字符串和表达式等复杂情况进行处理。
3.Go语言中循环仅提供了for关键字,没有其他语言的while或者do-while
其实刚看到容器还是有点儿懵的,仔细一看是数组啊,切片啊,双向列表,key-value这些,我仿佛记得这在其他语言中被成为集合类型
可以通过for语句对数组,切片和字典进行遍历
for K,v:range name{
}
如果仅仅需要遍历值或者键值,则可以使用Go语言的匿名变量
但需要注意,这个语法当中是传值遍历,对元素的修改不会影响到原容器内容。
接口是调用方和实现方约定的一种合作协议,调用者不关心接口的实现方式。样式如下:
type interfaceName interface{
method1(params)(return params)
method2(params)(return params)
method3(params)(return params)
}
结构体的定义
type structName struct
{
value1 valueType1
value2 valueType2
}
后面还有接收器和内嵌和组合,但其实并不值得拿出来单独研究,当前看来还没有Go语言并没有class关键字,将struct的应用进行了扩展,起到对象的作用,而闭包函数其实也可以理解为对象。
总结一下迄今为止我理解的Go语言特性:
这一章主要是语言特性,其实看了就是建立个印象,为之后读代码建立点儿知识储备,有编程基础的完全可以不看,后续代码读多了,也就逐渐都掌握了。
下面一节进入Go语言高级特性
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!