GO-02.代码结构.md

代码语言结构

学习一门语言,我们先了解一下这门语言的基本结构,这可以帮助我们拥有快速看懂一门语言编码的能力。毕竟如果是从头造轮子,很多时候,我们可以用自己熟悉的编程语言,另外就是其实看一些优秀项目可以帮我们更快的学习一些使用的语言编写规范和技巧。本来先写01的简介,但是想想,还是专门记录一下GO的语言结构,以便自己查看新的go代码时,可以更快速的上手。
GO代码的语言结构,我们以一个简单的 Hello,world 为例,代码由一下几个部分组成。

1
2
3
4
5
6
7
8
9
10
11
12
package main // 包声明

import "fmt" // 引入包

func init(){
fmt.PrintLn("Prepare") // 进行项目执行前的准备工作。
}

func main() { // 定义函数
   /* 这是我的第一个简单的程序 */ // 必要的注释内容
   fmt.Println("Hello, World!") // 处理逻辑/语句
}

多文件包

GO同级目录包可以直接引用

和其他语言不通,在GO中,如果几个go项目的文件定义属于同一个包(首行的package),那么即便函数在不同的代码文件中,也可以直接调用互相调用。
但是由于不同的go解释器本身差异,可能部分解释器不会把所有包一起编译/执行,需要在编译/执行 时,选择全部的go文件。那么就可以实现跨包内的多脚本,进行函数、变量、对象的调用

  • func.go(定义了函数) 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package main

    func Fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
    c <- x
    x, y = y, x+y
    }
    close(c)
    }
  • main.go(主程序) 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package main

    import (
    "fmt"
    "time"
    //"strconv"
    )

    func main() {
    c := make(chan int, 3)
    go Fibonacci(cap(c), c)
    // range 函数遍历每个从通道接收到的数据,因为 c 在发送完 10 个
    // 数据之后就关闭了通道,所以这里我们 range 函数在接收到 10 个数据
    // 之后就结束了。如果上面的 c 通道不关闭,那么 range 函数就不
    // 会结束,从而在接收第 11 个数据的时候就阻塞了。
    time.Sleep(1)
    fmt.Println(len(c))
    for i := range c {
    fmt.Println(i)
    fmt.Println()
    }
    }

在这种情况下,我们可以执行多包的编译,从而实现类似上文中的包的调用

unix机器

1
2
3
4
5
go.exe run main.go func.go 
## 但是显而易见的,当我们包的文件躲起来的时候,输入包的名字会成为巨大的负担

# 所以在unix 机器上,我们可以使用通配符(这在windows上开发时不可行。)
go run *.go

windows机器

在windows上,通配方案往往会出现问题,这个时候的一个可选的解决方案是,撰写一个 run.bat 文件放到目录中,然后每次执行这个文件

1
2
3
go.exe build
.\{project_name}.exe
go.exe clean

-------------本文结束感谢您的阅读-------------