Day3 First Go application

前言

前面的章节可以建议使用线上IDE进行练习与熟悉。

线上 Go IDE的网址在下方

https://play.golang.org/

始於Hello World

无论是从终端机touch或是用goland新增,请产生一个名为hello.go的档案并输入以下内容:

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

对於简短的程序码,可用go run指令执行!

go run hello.go
Hello World

较为复杂的程序码,则需要先进行指令编译成执行档在执行:

go build hello.go
$ ./hello
Hello World

程序码解说

我们再重新看一次程序码,并配合注解服用:

// Set current package
package main

// Import some package
import "fmt"

// Enter main function
func main() {
	// Print out string "Hello World" on stand output.
	fmt.Println("Hello World")
}

  • package: 当前的package,若package为main则代表当前档案为主执行档。
  • import: 指该程序码内有被引用的package,与其他程序语言不同的是,若在Go中import一个未被使用的package,则会报错。
  • func main: 主函式,何谓主函式我们会在下个段落仔细解说。

主函式 Main Function

  1. 主函式是一个特殊的函式,用於应用程序的起始点或是进入点。
  2. 每个GO应用程序只会有一个主函式,且由於主函式写法是固定的,读者不必担心不会写主函式,将主函式当成制式的模板程序码即可。
  3. 当专案规模小时,可以将程序码都放置在主函式之中,但随着专案规模扩大,我们需要将程序码依照重复性以及功能性切画出来。

下方我们将原本的 Hello World 程序改写如下:

// Set current package
package main

// Import some package
import "fmt"

// Enter main function
func main() {
	sayHello()
}

// Write down Hello World function
func sayHello() {
	// Print out string "Hello World" on stand output.
	fmt.Println("Hello World")
}

Package说明

我们找到Println的说明(command + 左键点选指定函式),可以看到Println的公开介面如下:

func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

由这个公开界面可知,Println接收任意数量的参数,参数为任意型别 (interface{})。该函式会回传两个参数,分别是整数 nerr 物件n 表示写入的字串长度而 err 回传错误物件,当程序没有发生错误时,err 为空值nil。

我们的范例程序中,我们知道程序不会发生错误,而且也不需要知道字串的长度,故我们忽略程序的回传值。

Go的一些小常识

  • 一个专案(Project)可以由N个包(Package)组成
  • 一个包(Package)可以有N支程序(.go file)
  • 同一个包(Package)底下的程序(.go file)彼此全域变数及函式可以互见,就像在同一支程序里一样
  • 包(Package)的名称 为包所在的资料夹名称
  • 一个程序(.go fle)只能属於一个包(Package)
  • 一个程序(.go fle)可以有多个变数、函式(function)
  • 程序(.go file)的名称 不一定要等同於资料夹或包(Package)的名称
  • 一个专案中一定会有一支(或多支)主程序(package main)
  • 主程序(package main)代表我们可以主动 go run 执行这包程序
  • 主程序里面一定要有
    1. package main
    2. func main()
  • func main(){}就是执行专案时程序的进入点

简单来说,他们的阶层关系为

Project(专案) > Package(程序包) > .go file(程序档) > Function(函式)

然後他们也有公认的命名方式:

  • 变数、函式、结构大写开头代表对外暴露,就是Public
  • 也就是说小写开头为Private
  • 换个角度想,func main()、func init()(之後会看到) 都是在这个当前的Package里执行,所以会是小写啦。

GO folder structure

GOROOT放的是安装的go语言、官方内建的函式库。

例如经常使用到的fmt就是放在此

import "fmt"

GOPATH则是放别人开发的第三方套件、以及自己的程序码

import "github.com...(别人的repository)"

这两点应该前个章节已经提及,但因为颇为重要所以在提醒一次。

照惯例通常会把自己写的专案及程序放入GOPATH底下的**src(source)**资料夹里,如果有用Github会再多一层 github.com 及 account。

以上的分法都通常是在较久远的年代,透过glide或dep来管理。自从Go 1.11 推出了gomod後,就不一定要把专案放到GOPATH底下,也可以正常运行但这边还是偏向使用GOPATH及glide套件管理工具

GOPATH目录架构

使用者目录 (C:\Users\USER 或 ~/) 

- Go (GOPATH) 如果底下没有bin/pkg/src目录,别担心,自己新增一个

- bin (放编译过後的可执行档案 二进制档案)

- pkg (放编译过後的library)

- src (放原始码 Source Code)

    - [github.com](http://github.com/)

        - Jack (使用者名称)

            -JackProject (专案名称)

                - main.go (主程序)

        - Tom

            -TomProject

                - core (函式库名称)

                    - core.go

                - libs (函式库名称)

                    - lib.go

                - main.go

        - [gitlab.com](http://gitlab.com/)

Summary

这章节主要让大家撰写第一个Go Application,并告诉大家程序摆放的目录架构、基本Go程序的知识点等,在下个章节则会带大家进入变数的世界。


<<:  [Day3] 自我必备进化力:找到一面镜子

>>:  LiteX/VexRiscv 简介与使用 (二) 始有昼夜

爬虫怎麽爬 从零开始的爬虫自学 DAY25 python网路爬虫开爬6-资料储存

前言 各位早安,书接上回我们将程序码改得更方便阅读,还加上抓取连结的功能,今天我们要来把这些抓到的资...

@Day27 | C# WixToolset + WPF 帅到不行的安装包 [额外的DLL引用]

套件 在我们写程序时,一定会用很多来支援,让我们更轻松, 尤其是WPF的部分,为了漂亮肯定用了很多套...

前言

图片来源:roadmap.sh 内心剧场之胡言乱语 每个故事都有开头和结尾(?),每个怀有远大(?...

D2 - 第一周 暖身周

  这周要开始学习 cli, git, 用文字指令做一些事情,但还没开始写程序。本周要突破的一道难关...