golang了解

shuju345 · · 1203 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go是Google开发的一种编译型,可平行化,并具有垃圾回收功能的编程语言。

第一点:

package main
func main(){
print("HelloWorld\n")
}
#include<stdio.h>
void main(){
printf("helloworld\n");
}

跟C一样,go 也需要一个main函数
  不同:
  1. 函数多了一个关键字 func;
  2. go函数中的第一个{必须和函数名同一行,换行运行时会出错("prog.go:11: syntax error: unexpected semicolon or newline before { ")[1] 
  3. 函数print 是go 不过几个内置函数哦。prinf则是stdio中的库函数
  4. 主函数必须是package main;
  5. 结束的分号可以不写哦。当然你一行就好几句,就不能省了。

第二点:

变量类型接下来我们看看变量类型吧。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. }


  除了第六行,好像其他都不一样。
  不同:
  1. 变量的声明不同了首先是关键字var, 然后是变量名 i, 然后是类型 int;跟C反了,还多了一个关键字var;为什么要反过来呢? 官方文档里面介绍了, 为了避免c中的某些疏忽, 也许我们都曾经错过哦! 如:int *a,b; 定了两个不同的类型 a是int *; b 是int; 很容易误解为都是指针哦。 go中就没有问题了 var a, b * int; 呵呵,全部是整型指针;
  2. print也不一样,不同的内容直接用逗号隔开,好像没有c的好,特别是当大量文档中插入数字时,要分好多断。有没有类似c的格式化函数呢?让我们慢慢学习吧。
  3. print的参数没有严格要求,既认识i是整型,有认识“\n”是字符串;这一点比C强多了。
  4. 如果编译,会发现左边的第7行有语法错误。因为i的类型和j的类型不同,而c中就没有这么严格了阿。报个warning;而go中则需要明确写成j=int8(i+1); 好像有点烦哦! 注意是int8(i+1) !
第三点:for

好了,来个for循环吧。
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")
         
}
     
}
 
}
代码有点奇怪,也有点不知道什么意思,是的,没有什么目的, 就是想介绍一下 变量的声明,和作用域, 以及for的写法;
  1. a:=0 是变量声明的一种简写,具体a是什么类型有后面的赋值决定; 这样写只能一次哦。下次要给a赋值需要直接写a=****; 那这个a是什么类型呢? int8, int16。。。?写个小程序试试吧!
  2. 疑? i:= 怎么用了两次呢? 等下面打印的结果你就会发现这两个i不一样阿。各自的作用域都是自己的for循环,第二个i覆盖了第一个i哦!
  3. 再来看看for吧,好像也少了点什么? 对阿。括号没有了。而且必须没有哦; 还有开始的大括号也不能另起一行哦。
嗨是不是有点乱阿。 但是对于咱们这些有基础的老程序员,那有心思去一个一个看说明。 看了好一段,一个程序也写不了。看到后面又把前面的忘了。 好继续; 有这么多, 来冒个泡吧。

第四点:冒泡



  • 1.package main
  • 2.func main(){
  • 3.var a=[...]int{10,25,32,11,6,36,18,22,5,7}
  • 4.//var a[10]int=[10]int{10,25,32,11,6,36,18,22,5,7}
  • 5//var a[10]int=[...]int{10,25,32,11,6,36,18,22,5,7}
  • 6.fori:=0;i<len(a);i++{
  • 7.forwhile:=i;while<len(a);while++{
  • 8.ifa[i]>a[while]{
  • 9.a[i],a[while]=a[while],a[i]
  • 10.}
  • 11.}
  • 12.}
  • 13.i:=0
  • 14.fori<len(a){
  • 15.print(a[i],"\t")
  • 16.i++
  • 17.}
  • 18.}
  • 数组的初始化有三种,第一中最简单,具体有几个有编译器自己数,减少了不少程序员的负担。至于后两种,必须是10个哦。否则报错;当然如果你的要求就必须是10个,还是写上数字吧,让编译器帮你检查一下,以防止敲错了!当然还可以写成a:=;
  • 数组可以求长度了,有点像java了。
  • 一直有个梦想, 想定义一个变量叫while,怎么也无法实现, 今天go帮我实现了。go中没有while关键字。只有for。用最少的关键字。 go真为程序员作想。
  • 快看第十行阿。两个变量交换,一句话就完成了,在C中怎么也要三行代码;还有一个中间变量;不是这个是不是一条汇编语句完成的。
  • 虽然没有while, go 也没有忘记我们的习惯, 将两个分号两边的赋值去掉,for就变成while格式了。对于while(true)则简单了。一个for就完成了。
  • 15,16行为什么不合并呢?自己试试吧。 语法错误哦。go的文档中说++后面,编译器会自动添加分号。


  • package main
  • func main(){
  • var a=[...]int{10,25,32,11,6,36,18,22,5,7}
  • //var a[10]int=[10]int{10,25,32,11,6,36,18,22,5,7}
  • //var a[10]int=[...]int{10,25,32,11,6,36,18,22,5,7}
  • fori:=0;i<len(a);i++{
  • forwhile:=i;while<len(a);while++{
  • ifa[i]>a[while]{
  • a[i],a[while]=a[while],a[i]
  • }
  • }
  • }
  • i:=0
  • fori<len(a){
  • print(a[i],"\t")
  • i++
  • }
  • }
  • 数组的初始化有三种,第一中最简单,具体有几个有编译器自己数,减少了不少程序员的负担。至于后两种,必须是10个哦。否则报错;当然如果你的要求就必须是10个,还是写上数字吧,让编译器帮你检查一下,以防止敲错了!当然还可以写成a:=;
  • 数组可以求长度了,有点像java了。
  • 一直有个梦想, 想定义一个变量叫while,怎么也无法实现, 今天go帮我实现了。go中没有while关键字。只有for。用最少的关键字。 go真为程序员作想。
  • 快看第十行阿。两个变量交换,一句话就完成了,在C中怎么也要三行代码;还有一个中间变量;不是这个是不是一条汇编语句完成的。
  • 虽然没有while, go 也没有忘记我们的习惯, 将两个分号两边的赋值去掉,for就编程while格式了。对于while(true)则简单了。一个for就完成了。
  • 16,17行为什么不合并呢?自己试试吧。 语法错误哦。go的文档中说++后面,编译器会自动添加分号。
    五, Array 与 slice
      六,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打印该变量,还有待研究。

  • 有疑问加站长微信联系(非本文作者)

    本文来自:CSDN博客

    感谢作者:shuju345

    查看原文:golang了解

    入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

    1203 次点击  
    加入收藏 微博
    暂无回复
    添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
    • 请尽量让自己的回复能够对别人有帮助
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
    • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
    • 图片支持拖拽、截图粘贴等方式上传