在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
摘要在配置好环境之后,要研究的就是这个语言的语法了。在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆。因为这篇文章只是入门Golang的第二篇文章,所以本文并不会对一些指令进行深挖,仅仅只是停留在“怎么用”的程度,至于“为什么是这样”,则涉及到了具体的应用场景和汇编指令,作者将会在以后的文章中进行介绍。 1 导包总所周知,“Hello World”是程序员的一种仪式感。 而这一行“Hello World”,一定会涉及到输入输出相关的方法。所以,如何导入包,是我们需要研究的第一步。 在C语言中,我们使用
下面举一些例子来说明在Golang中包名和目录的关系,先来看看目录结构:
可以看出,我们在 src 下面设置了两个文件夹,在第二个文件夹下面设置了两个go文件。来看看这两个文件的代码,test1.go如下:
test2.go如下:
然后我们再来看看testmain.go下面的内容:
注意到了吗,我们在调用 按照我们在Java中的思想,我们应该是使用 这是因为在Golang中,没有强制要求包名和目录名称一致。也就是说,在上面的例子中,我们引用路径中的文件夹名称是 也就是说,我们可以理解为,包名和路径其实是两个概念,文件名在Golang中不会被显式的引用,通常的引用格式是 结论如下:
2 声明看完了导包方面的内容,我们再来看看如何声明一个变量。在声明变量这一部分,和C以及Java也有较大的区别。 2.1 变量的定义我们先定义一些变量看看:
我们可以看到,在Golang中定义一个变量,需要使用 还有另外的一种做法,是使用 在变量的定义过程中,如果定义的时候就赋予了变量的初始值,是不需要再声明变量的类型的,如变量
2.2 匿名变量
如上述代码所示,如果我仅仅需要一个变量的值,就不需要去额外定义一些没有意义的变量名了,仅仅只是需要使用占位符这种“用后即焚”的匿名变量。 2.3 常量在Golang的常量定义中,使用 3 判断我们在使用Java或者C的时候,写判断语句是这样的:
在Golang中,唯一的不同是不需要小括号,但是大括号还是必须的。如下:
除去不需要写小括号以外,Golang还允许在判断条件之前执行一个简单的语句,并用一个分号 4 循环在Golang中,只有一种循环,for循环。 和判断语句一样,在Golang中也是没有小括号的。
此外,在循环条件中,初始化语句和后置语句是可选的,这个时候把分号去掉,
不仅如此,如果省略循环条件,该循环就不会结束,因此无限循环可以写得很紧凑,这个时候,和
5 函数5.1 函数的定义在Golang的函数定义中,所有的函数都以
在Golang的函数定义中,一样可以不接受参数,或者接受多个参数。而在参数的定义过程中,也是按照定义变量的格式,先定义变量名,再声明变量类型。对于函数的返回类型,也是按照这样的格式,先写函数名,再写返回类型:
并且,对于相同类型的两个参数,参数类型可以只写一个,用法如下:
在Golang中,对于函数的返回值,和C以及Java是不一样的。
例如下面的小李子,
其次,函数的返回值是可以被命名的:
在这里,我们可以理解为在函数的顶部预先定义了这些变量值,而空的 5.2defer在Golang中,有一个关键字叫
在这段代码中,本来的执行路径是从上往下,也就是先输出“world”,然后再输出“hello”。但是因为
可以考虑到的场景是,文件的关闭,或数据库连接的释放等,这样打开和关闭的代码写在一起,既可以使得代码更加的整洁,也可以防止出现开发者在写了长长的业务代码后,忘记关闭的情况。 至于defer的底层实现,本文不进行详细的解释,简单来讲就是将defer语句后面的函数调用的地址压进一个栈中,在当前的函数执行完毕,CPU即将执行函数外的下一行代码之前,先把栈中的指令地址弹出给CPU执行,直到栈为空,才结束这个函数,继续执行后面的代码。 从上文刚刚的表述中也可以推断出,如果有多条refer语句,将会从下往上依次执行。 因为本文只是对各种指令简单的进行对比,所以对于refer的详细解释,将在以后的文章中详细说明。 6 指针对于指针,如果是C或者C++开发者,一定很熟悉;而对于Java开发者,指针是对开发者透明的一个东西,一个对象会在堆中占据一定的内存空间,而在当前的栈桢中,有一个局部变量,他的值就是那个对象的首地址,这也是一个指针。 可以说,指针就是开发者访问内存的一种途径,只不过是由控制权交给了开发者还是虚拟机。 在Golang中,指针的用法和 C 是一样的。同样是用
7 数组在Golang中,数组的定义是这样的:
这样做会将变量 a 声明为拥有 10 个整数的数组。
7.1切片数组的切片,顾名思义,就是将一个数组按需切出自己所需的部分。 每个数组的大小都是固定的。而切片则为数组元素提供动态大小的、灵活的视角。在实践中,切片比数组更常用。 切片通过两个下标来界定,即一个上界和一个下界,二者以冒号分隔:
它会选择一个半开区间,包括第一个元素,但排除最后一个元素。 以下表达式创建了一个切片,它包含 a 中下标从 1 到 3 的元素:
举个例子:
我们定义了一个数组,里面含有"aaa","bbb","ccc","ddd"四个元素。然后我们定义了两个切片, 这个时候,我们把b[0]改成了"XXX",那么 这是因为,Golang中的切片,不是拷贝,而是定义了新的指针,指向了原来数组所在的内存空间。所以,修改了切片数组的值,也就相应的修改了原数组的值了。 此外,切片可以用append增加元素。但是,如果此时底层数组容量不够,此时切片将会指向一个重新分配空间后进行拷贝的数组。 因此可以得出结论:
7.2 make
make 函数会分配一个元素为零值的数组并返回一个引用了它的切片:
要指定它的容量,需向 make 传入第三个参数:
也就是说,make函数可以自定义切片的大小。用Java的话来说,他可以被重载。 有两种形式,如果只有两个参数,第一个参数是数组内元素的类型,第二个参数是数组的长度(此时长度和容量都为5)。 而如果有第三个参数,那么第三个参数可以指定数组的容量,即可以指定这个数组在内存中分配多大的空间。 写在最后首先,谢谢你能看到这里。 如果这篇文章对你能起到哪怕一点点的帮助,作者都会很开心! 其次要说明的是,我也是刚开始接触Golang,写这篇文章的目的是起到一个笔记的效果,能够去比较一些C,Java,Golang中的语法区别,也一定会有不少的认知错误。如果在这篇文章中你看到了任何与你的认识有差距的地方,请一定指出作者的错误。如果本文有哪些地方是作者讲的不够明白的,或者是你不理解的,也同样欢迎留言,一起交流学习进步。 而且在本文中,很多地方没有进行深入挖掘,在这篇文章中,就只是单纯的学会怎么用,就达到目的了。深入的可以参考原作者的其他文章哦。 那么在最后,再次感谢~ PS:如果有其他的问题,也可以在公众号找到原作者。并且,所有文章第一时间会在公众号更新 原作者:红鸡菌 链接:https://juejin.cn/post/6844904117450571790 来源:掘金 著作权归原作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 |
请发表评论