参照Java学Go(一)—— 初识Go

    最近在学习使用golang,在学习新的语言时,如果可以对照着一门自己熟悉的语言来学习会容易很多,本人是名java程序猿,所以就对照着Java来学习,以”温故知新“的方式来记录一下学习过程。

    刚开始,先从语言界定、环境搭建、helloword和包结构对比学习一下:

一,语言界定

先来总结一下:go和java一样,是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。 

编译型or解释型:

    java,其实是混合型的语言,java代码先编译型字节码,然后再在java虚拟机中解释执行,严格来说还是解释型的;
    go,编译型语言

  动态or静态:
    java,在运行时不能动态改变,属于静态语言,同时也是静态类型语言;(很多人认为解释型的都是动态语言(或动态类型),这是错误的,如java)
    go,也是静态语言,也是静态类型语言,但没有java那么明显;

  强类型or弱类型:
    java,强类型

    go,强类型

  OOP:
    java,是
    go,是
  

二,环境搭建

    java和go的安装都很简单,不做过多阐述,此前在博客也对go的环境搭建做过简单记录,可以参考:go开发环境搭建

  安装后,同样需要配置环境变量:
  
GOROOT 对应JAVA_HOME
GOPATH,相当于CLASSPATH

    对于java和go的ide选择就全看个人喜好了,本人java开发,此前eclipse,后用idea;go的ide也随着我的喜欢选择了goland,跟idea的使用没有差别,再有这里想说的一点是,不建议在idea或pycharm中安装go插件来使用,问题比较多(不知道目前有没有改善)



三,helloword
  helloword使我们在学习一种语言的第一步,简单对比一下java和go的helloword

  java:

  //包
  package com.java.demo;
  //引用包(举例,程序未使用)
  import java.util.List;
  //类
  public class HelloWorld {
      /**
        第一个Java程序
       */
      public static void main(String []args) {
          System.out.println("Hello World"); // 打印 Hello World
      }
  }
  go:
  
  //包
  package main
  //引用包
  import "fmt"
  //main函数
  func main() {
     /**
        第一个go程序
       */
     fmt.Println("Hello, World!")
  }
      对于java程序员来说,感觉上还是挺好的,结构大致相同:都有package、import、main函数三个部分,而且关键字完全相同,挺好!

       接下来就是不同:

  1,行末尾没有“;”,go语言不用显示写“;”,直接换行就好,编译器会自动解析,但如果要在一行写多条语句,那么就要显示的用“;”分隔了。
  2,package路径,java中包都是同包(src下的目录)结构一致的,但是go的包不是这样的,需要根据是否是可执行程序,如果是那么package只能是main,如果不是那么可以根据个人喜欢随便命名,与目录结构无关;
  3,import的写法不同,go通过包名字符串引入;
  4,go的helloword的main方法不用放到类里,go中没有class,但是有和java中的class相似的结构,叫struct,这个以后再说;
  5,main函数的定义有出入,这个也是java和go在函数定义语法上的不同。
  6,还有一个与java不同的地方就是,没有用到的包是不能引用的,如:在java的hellowrod中引用了List,只引用没有用,没问什么问题,但是这种情况在go中是会报错的;


四,go的包

    最后在开始正式学习golang前先重点说下go的包,我想对于java程序猿来说,刚接触go最大的不习惯应该就是这个package了。  

    go其实没有项目的概念,只有包的概念,所有的包都放在$GOPATH/src 下,GO命令和编译器会在 $GOPATH/src 目录下搜索相应的包;

    包分为两种,可执行包和不可执行包,上边的helloword的package名字是main,说明就是可执行包,固定写法;如果不是main就说明是不可执行包,那么不可执行包的命名有没有规则呢?没有,哈哈可以随便写,和java不同,包的名字和和工程的目录是没有关系的。那么好,随便写,怎么解决包冲突的问题呢?这个时候就用到目录结构了,上边说了,所有的包都会放到$GOPATH/src下,在src下是根据包的目录存储的,如:

$GOPATH/src
    --you
      --sort
    --my
      --sort
  同样是sort包,分别是you和my两个工程下的,这样我们在引用的时候就可以这样写:
 
 import (
    yousort "you/sort" 
    mysort "my/sort"  
  )
  在impot的字符串中指定目录信息,通过为相同名字的包指定别名,在使用的时候就可以使用别名调用,如:mysort.Sort(...),yousort.Sort(...)。
  到这里就又会发现一个问题:相同包下面的代码文件中不能出现重复的函数名称,这个需要注意一下。

  包的权限问题:
    包中的方法的访问权限是根据名称首字母的大小写来区分的(这点跟java很不相同),如果首字母是小写,则表示是包内私有的(相当于java的private),如果首字母是大写,其他包就可以访问(public)在go的权限控制中也会说到。

  main函数和init函数:
    go中也有main函数,作用和java中的main函数相同,是可执行包(package main)的入口函数(如果有init函数,会先执行init),可执行包下有且只有一个main函数。
    init函数是初始化函数,不论是不是可执行包下都可以有init函数,并且报下的所有代码文件都可以有init函数,而且在一个代码文件中都可以有多个init函数,主要是完成初始化操作使用,作用类似java类中的static{}代码段,不过不建议创建多个init函数,多个代码文件中的init函数的执行顺序不可控,再有在说go和java的helloword的时候提到,如果引用的包没有使用时会报错的,解决办法除了移除外,也可以给未使用的包设个别名“_”,这样就不会报错了,这个就与init方法有关,当设置成”_“别名后,编译器就会去执行该报的init方法,来完成初始化操作,不会人为该包无用。

    这里的别名“_”并不是随便取的,“_”在go中是有意义的,后边会提到。


    好了,刚开始先记录这些,后面正式学习go的语法。

猜你喜欢

转载自blog.csdn.net/mingjia1987/article/details/80225368