GO - HelloWorld

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

本节将通过Hello World带领大家进入Go的世界,并由此介绍Go代码的主要结构、部分关键字和包的一些特性。为阅读后面的打下基础。

1. Let's go 
    
    咱们以往学习任何程序都会以Hello World作为第一个实例,在此咱们不按常理出牌,针对Go语言,我们的第一个程序以Let's go开始。(其实是换汤不换药哈!!)。

    代码如下:
    控制台的输出结果为:Let's go!
  • 第2行:定义此代码所属的包名,在一个项目中有且只有一个名为main的包。(最佳实践:包名由简短且小写的字母构成)
    • 包名为源代码文件所属的目录名。即同一包的所有的代码文件必须放在以此包名为目录名的目录下。
    • 在包的定义声明中只能有一个包名,这与Java、C#是不一样的(注:在Java中的包定义是从根依次引入的)
  • 第5~7行:定义此代码所依赖的其它包。(关键字import等同于Java中的import)
    • 可以引入多个包,并支持放在同一行,彼此之间以逗号“,”分隔。

    • 最佳实践:包的引入按标准库包,自定义包,第三方包的顺序定义
  • 第10行:为程序的入口函数,类似于C,Java中的main方法。
  • 第12行:调用标准库fmt中的Println函数将字符串输出到标准输出设备上。
    • 此库中还有几个类型的函数,如:Printf(), Fprint()等。
  • 在Go的注释方式支持两种,与C,Java相同。
    • 单行的注释://
    • 多行的注释:/*    */
    • 在包定义、包引入、全局变量/常量、函数定义上面的注释可以用godoc来查看或生成说明文档(注:注释与声明间不能有空行)
  • Go为了减少编码的输入,让代码更简洁。它允许每一行的最后可以省略分号“;"。
  • 最后编译链接后生成一个可执行二事制文件,如在Windows平台上为.exe文件。(注:此文件中包含了Go的运行时环境 -- 这使发布此程序变量的简单,不需要客户机上单独安装运行环境)
2. 包的特点

    包即是Go中组织源代码的一种结构,每一个go源码文件只能属于一个包(即存放于此包对应的目录下),但一个包可以包括多个go源码文件(但这些文件不能有同名)。(注:包的字名需要有小写字符)

    在编译时,包中的所有文件需要一起编译,并最终生成一个扩展为.a的文件,如pack1.a。

    Go标准库所处的目录因环境不同而有所差异:
  • 通用的标准是:$GOROOT\pkg\$GOOS_$GOARCH
  • Windows:$GOROOT\pkg\windows_386
  • Linux:$GORROT\pkg\linux_amd32/64
    包的依赖引用需显示的说明其依赖关系,由此加快编译速度。当一个包改变或重新编译后,所有的依赖于它的代码都将被重新编译。
    假设这里有三个文件:a.go依赖于b.go,b.go依赖于c.go:
  • 编译顺序为:c.go -> b.go -> a.go
  • 当只编译a.go时,编译器只需读取b.o文件,而不需要c.o。
    当使用import引用包时,需注意它的搜索路径:
  • 当没有以/开始时(如"fmt","container/list"),Go编译器会到Go的标准库中搜索此包。
  • 当以./开始时,则从当前路径为起始目录开始搜索。
  • 当以/开始时,则从系统的根目录开始搜索。
3. 包引用的可见规则

    在Go中对包中定义的各种标识(常量、变量、函数、类型等)的可见性只有两种:
  • 以大写字母开始的标识,在包外可见。即当使用import引用包时,这些标准可以在客户代码中直接调用(引用)。也就相当于Java中以Public关键字修饰的标识。
  • 以小字字母开始的标识,在整个包内可见,即可以在包内的多个文件中可见。相当于Java中用private修饰的标识。
  • 包相关于命名空间,不同包下相同名字并不冲突,并在某些特定情况可以在import包时,指定别名来在避免冲突。
4. 实例代码

    本例主要展示自定包义的组织结构、包中各代码文件的关系、代码中各种标识符的可见性和包的引用。代码结构如下所示:
   
  • 新创建一个名为chapter3的包,其中包括两个代码文件(demo1.go和demo2.go)和子包inner。
  • 子包inner中包含一个代码文件:innerpack.go。
    各代码块如下:
  • main包及入口函数

  • demo1.go

  • demo2.go

  • inner包中的innerpack.go

  • 输出结果为:

    总结:
  • 在客户代码中导入自定义包时,一般是通过相对路径来指定,而对于导入标准库时,则是直接以包名开始。 如本例的demo1.go的第4,5行:
    • 第4行:导入的是自定包,位于子目录inner中。
    • 第5行:导入标准库的包,则直接以包名开始,以映射到$GOROOT\pkg\windows_386\。
    • 包的导入顺序:首先是自定义包,再是标准包。
  • 同包中的多个代码文件彼此间的全局变量、函数等都是相互可见的。
    • 如在demo1.go中可以直接调用demo2.go中的以小写字母开头的方法。
    • 如在demo2.go中可以直接调用demo1.go中的以小写字母开头的变量。
  • 以大写字母开头的常量、变量和函数等在包外是可见的。
  • 每个包编译后都会生成一个以包名相同的扩展为.a的库文件。
  • 在同一包中的多个文件中不能有同名的变量、常量、函数等。需保证在包内唯一。

此代码请到我的资源中下载下载链接




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

本文来自:CSDN博客

感谢作者:aaron_ye

查看原文:GO - HelloWorld

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

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