Go是Google开发的一种编译型,可平行化,并具有垃圾回收功能的编程语言。
第一点:
package main
func main(){
print("HelloWorld\n")
}
|
#include<stdio.h>
void main(){
printf("helloworld\n");
}
|
不同:
-
函数多了一个关键字 func;
-
主函数必须是package main;
-
结束的分号可以不写哦。当然你一行就好几句,就不能省了。
变量类型接下来我们看看变量类型吧。go 跟c差不多。有明确的变量类型, 跟javascript比起来都是var 根据运算确定类型,感觉效率总是有问题;有时候甚至自己也不知是什么类型。
go 定义了如下类型 整型:int8, int16, int32, int64 (有符号的。好爽啊,直接表明所占的bit数,不知道是不是有人当初记char,short,int,long的长度也花了时间。),无符号,直接加个u,uint8,
uint16, uint32, uint64;float就只有float32,float64;当然他们也有int,这个int是32位,还是64位,就要根据机器的位数决定,还有byte=int8;还有一个string类型,暂且认为它跟java中的string差不多吧,就是无法更改其中的某个字符,除非生成一个新的字符串;
好吧,来个加法运算吧;
点击(此处)折叠或打开
1. package main
2. func main(){
3. var i int
4. var j int8
5. i=1
6. j=i+1
7. print(i,"\t",j)
8. }
|
点击(此处)折叠或打开
1. #include<stdio.h>
2. void main()
3. {
4. int i;
5. char j;
6. i=1;
7. j=i+1
8. printf("%d\t%d\n",i,j);
9. }
|
除了第六行,好像其他都不一样。
不同:
-
变量的声明不同了首先是关键字var, 然后是变量名 i, 然后是类型 int;跟C反了,还多了一个关键字var;为什么要反过来呢? 官方文档里面介绍了, 为了避免c中的某些疏忽, 也许我们都曾经错过哦! 如:int *a,b; 定了两个不同的类型 a是int *; b 是int; 很容易误解为都是指针哦。 go中就没有问题了 var a, b * int; 呵呵,全部是整型指针;
-
print的参数没有严格要求,既认识i是整型,有认识“\n”是字符串;这一点比C强多了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package main func main(){ a:=0 for i:=1; i<10; i++{ for i:=1; i<10; i++{ a+=i print(a, "\n" ) } } } |
-
a:=0 是变量声明的一种简写,具体a是什么类型有后面的赋值决定; 这样写只能一次哦。下次要给a赋值需要直接写a=****; 那这个a是什么类型呢? int8, int16。。。?写个小程序试试吧!
-
疑? i:= 怎么用了两次呢? 等下面打印的结果你就会发现这两个i不一样阿。各自的作用域都是自己的for循环,第二个i覆盖了第一个i哦!
-
再来看看for吧,好像也少了点什么? 对阿。括号没有了。而且必须没有哦; 还有开始的大括号也不能另起一行哦。
六,len注意点:对于s,用c语言来描述是一个结构体,其中包含了两个元素(str (*uint8), len(int64));其中str指向了真正的字符串;len中记录了字符串的长度;
所以,只有array的长度是直接由编译器得到,而slice,和string的长度则是有变量记录的;
七, 指针通过上面的程序可以发现,modify函数传进去的是s的地址,所以等函数返回后,s所对应的字符串已经更改;而mo函数中的b由于是s的copy,所以虽然在函数中修改了b的值,但是等函数返回后,仍没有效果, 但是有一点需要注意的是,b这个copy中,指示上面的str,len两个变量拷贝了,而实际的字符串只有一份,所以节约了空间,提供了性能;
写这段代码的时候,发现一个细节问题,如果注释掉行13; 在gdb中调试到第10行是,可以使用p s命令和whatis s命令查看s的具体结构,但是如果留有13行,则symble table中的变量变成了&s,在gdb中可以使用i locals查看到该变量,但是如果用p打印该变量,还有待研究。
有疑问加站长微信联系(非本文作者)