zoukankan      html  css  js  c++  java
  • go语言

    我们今天来学习的是:

    文章简介:gogo语言是一门略不同于c++c++,cc等常见语言的一门语言,有些地方甚至相反,本文就对gogo语言进行一个简略的介绍。

    我们先来看一张图:

    如图,我们可以看到各大语言的排行榜。本图省略了20002000年及以前的排行,而那时是cc语言居首位,之后JavaJava语言就逐渐取代了cc语言的位置。但是经过时间的磨练,JavaJava语言显然后劲不足,后来都趋近于cc语言了。

    之所以开发GoGo 语言,是因为“近1010年来开发程序之难让我们有点沮丧”。
    这一定位暗示了GoGo语言希望取代CCJavaJava的地位,成为最流行的通用开发语言。

    							————$go$语言官方
    

    下面我们就拿目前位居排行榜首位的JavaJava语言标准库中的线程和gogo语言比较一下:

    JavaJava

    public class MyThread implements Runnable {
    String arg;
    public MyThread(String a) {
    arg = a;
    }
    public void run() {
    // ...
    }
    public static void main(String[] args) {
    new Thread(new MyThread("test")).start();
    // ...
    }
    

    gogo:

    func run(arg string) {
    // ...
    }
    func main() {
    go run("test")
    //...
    }
    

    果然名副其实,是一门说gogogogo的语言,当然也有人说,叫gogo语言是因为是GoogleGoogle出的吧,这也有道理,但我们今天讨论的不是这个。

    go语言的历史

    说到了gogo语言,我们就不得不提起大名鼎鼎的贝尔实验室,19691969年该实验室就发明了一个有名的操作系统————UnixUnix(我咋都不知道呢)。而我们众所周知的CC语言,便是由UnixUnix衍生出来的。

    后来他们发展出了一个UnixUnix的后续代替系统。在之后的几十年中,该研究项目又演变出了另一个
    InfernoInferno的项目分支,以及一个名为LimboLimbo的编程语言。而这个LimboLimbo,就是gogo语言的前身。

    再后来,这一批贝尔实验室的人加入了GoogleGoogle,正式发明了gogo语言。


    go语言的注意事项

    PS:之所以把它放在比较靠前的位置,是因为为了后面阅读的便利

    1、定义和变量之间的位置关系

    func getName()(firstName, middleName, lastName, nickName string){
    return "May", "M", "Chen", "Babe"
    }
    

    我们注意到,有一段是nickNamenickName stringstring 。这里如果转化为c++c++等等,就是stringstring nickNamenickName。我们要习惯这种变量倒着定义的方法。


    2、每行代码后不加分号

    func getName()(firstName, middleName, lastName, nickName string){
    firstName = "May"
    middleName = "M"
    lastName = "Chen"
    nickName = "Babe"
    return
    }
    

    可以发现,这其中每一行代码后都没有分号。这是比较大的不同之处,也是两种语言相互转化时最容易出错的。


    3、主函数,子函数,forfor语句等等的‘{’必须要紧跟着语句写,也就是说不能换行!!!还有就是子函数和主函数的开头要‘定义’为funcfunc

    func main() {
    var fly IFly = new(Bird)
    fly.Fly()
    }
    

    这种例子我不举出大家应该都能想到,不过我还是如图,举一个主函数的例子。我们可以看到,funcfunc main()main()后的‘{’并没有换行(千万别把这个当成习惯问题,gogo语言必须这样写)。


    4、关于:=的使用

    ...
    sum := 0
    ...
    

    例如这么一句话。其实,它的意思就是先定义sumsum,然后再把sumsum值赋成00。当然大家肯定会有一个问题:这样是定义成什么类型呢?answeranswer:根据:=后的数值————也就是要赋的值觉得,比方说,你赋一个整数,它就给你定义成intint 型。赋一个字符,它就给你定义成charchar型等等。


    5、调用子函数

    go sum(values[:len(values)/2], resultChan)
    go sum(values[len(values)/2:], resultChan)
    

    gogo语言的子函数调用就如其名,要在前面加上一个gogo。但是和c++c++等等仅有一个gogo字之差吗?答案并不是。其实这一个gogo,就相当于把每个执行的子函数都分到不同的地方执行。同时进行,这效率不言而喻。


    go语言的一些小应用

    part 1:go语言返回值

    func getName()(firstName, middleName, lastName, nickName string){
    return "May", "M", "Chen", "Babe"
    }
    

    以上是一个gogo语言的函数,我们注意到,刚开始的定义的不是intintdoubledoubleboolbool 类型等等,而是funcfunc(全拼:functionfunction

    在函数后有两对(),前面一对表示括号表示传入这个函数的参数,而后面括号就表示传出这个函数变量(参数)。

    当然,函数中肯定会做一些事情,最后可以返回四个变量(因为定义了四个)

    PS:其他方面的gogo语言过于深奥(其实是我不会了),下面我们来看一个简单的程序HelloHello WorldWorld!(有一种历史的沧桑感),来一窥gogo语言的基本结构。

    part 2:Hello World!!!

    package main//每个程序都要加上一个package main开头,其中包含一个main()函数(主函数),也就是执行程序的起点
    import "fmt"// 我们需要使用fmt包中的Println()函数
    //以上略等同于#include<cstdio>/#include<iostream>
    //using namespace std;
    func main() {//进行主函数,这里不要忘了注意事项里讲述的坑点!
    fmt.Println("Hello, world. 你好,世界!")//就像printf(".....")/cout<<"....."类似。
    }
    

    由于注释太多,一些解释挪到下面。

    我们借此机会再阐述一下子函数的格式:

    func 函数名(参数列表)(返回值列表) {
    // 函数体
    }
    

    再来让我们看一个实例:

    func Compute(value1 int, value2 float64)(result float64, err error) {
    // 函数体
    }
    

    c++c++不同,它可以返回多个值。如例子,它返回了resultresulterrerr两个值。当然,如果这两个变量没有赋值,那么就好返回它们各自的初值,比如resultresult就是0.00.0errerr就是nilnil

    当然,gogo语言的注释和c++c++等语言的注释还是完全一样的

    go语言编译环境准备

    搜索一下"goloanggoloang"你很容易获得的。

    条件语句

    e.g.:

    if a < 5 {
    return 0
    } else {
    return 1
    }
    

    关于条件语句,我们需要注意以下几点:

    1、 条件语句不需要使用括号将条件包含起来()

    2、 无论语句体内有几条语句,花括号{}都是必须存在的

    3、 左花括号{必须与ifif或者elseelse处于同一行;

    4、 在ifif之后,条件语句之前,可以添加变量初始化语句,使用;间隔;

    5、 子函数最终的returnreturn 不允许在ififelseelse中出现。这句话有些难懂,下面提供一个例子:

    func example(x int) int {
    if x == 0 {
    return 5
    } else {
    return x
    }
    }
    

    这样就会编译错误喽!!(因为子函数的返回:returnreturn 进入了条件语句


    go语言的循环语句

    循环语句包括forforwhilewhiledowhiledo-while等等,但gogo语言中仅仅支持forfor关键字

    e.g:

    sum := 0
    for i := 0; i < 10; i++ {
    sum += i
    }
    

    如例,这段代码计算的就是1+2+3+4+5+6+7+8+91+2+3+4+5+6+7+8+9.

    也和条件语句一样,它不需要用()包裹起来。。.

    这段代码与其他语言基本相似,在这里不再赘述

    e.g:

    sum := 0
    for {
    sum++
    if sum > 100 {
    break
    }
    }
    

    如例,这是一个类似与c++c++等语言中whilewhiledowhiledo-while之类的语句,就是简化了不必要的部分,让人们不用再写forfor (;;)(;;)

    还有一个核心的部分:多重赋值

    e.g:

    a := []int{1, 2, 3, 4, 5, 6}
    for i, j := 0, len(a) – 1; i < j; i, j = i + 1, j – 1 {
    a[i], a[j] = a[j], a[i]
    }
    

    注意到倒数第二行,相当于swap(a[i],a[j])swap(a[i],a[j]);

    go语言switch语句

    cc类似,不过默认casecase之间是分割的,不用怕忘记breakbreak了。

    后记:

    1、本人文章主要讲述一些信息学上的各类新语言,结构等。如想浅析区块链,请移步:https://www.luogu.org/blog/cong666/qian-tan-ou-kuai-lian-chu-bu

    2、部分内容来自‘图灵社区会员’

    3、另一个研究作业:自行了解gogo语言调用CC语言?

    4、日后我可能还会发表gogo语言的拓展,那时会更深一层的解释

    期待下次再会!

  • 相关阅读:
    yablog: calculate cosine with python numpy
    HDF
    numarray 1.5.1
    Angles between two ndimensional vectors in Python Stack Overflow
    3D stem plot
    linq to sql一定要注意的地方!
    将IRepository接口进行抽象,使它成为数据基类的一个对象,这样每个子类都可以有自己的最基础的CURD了
    (SQL)比较一个集合是否在另一个集合里存在的方法
    linq to sql统一更新方法,直接返回更新的对象(解决更新后再刷新数据错误显示问题)
    LINQ TO SQL数据实体应该这样设计(解决多表关联问题)
  • 原文地址:https://www.cnblogs.com/vercont/p/10210114.html
Copyright © 2011-2022 走看看