GO Lang学习笔记

Go lang Learn Note

标签(空格分隔): Go


Go安装和Go目录

设置环境变量GOROOTGOPATH,前者是go的安装目录,后者是开发工作目录。go get包只会将包下载到第一个工作目录(多个GOPATH的时候)。

Go语言命令行工具介绍

  • go build 用于编译源码文件、代码包、李赖堡
  • go run 可以编译并运行go源码文件
  • go get 主要是用来动态获取远程代码包

GoLand编辑器选择和配置

GoLand下载

一、GO语言基础语法

1. 关键字、标识符

  • GO中保留的关键字(25个)
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
  • GO中预定的标识符,包括基础数据类型和系统内嵌函数(36个)
append bool byte cap close complex
complex64 complex128 uint16 copy false float32
float64 imag int int8 int16 uint32
int32 int64 iota len make new
nil panic uint64 print printIn real
recover string TRUE uint uint8 uintprt

2. 注释

  • // 单行注释
  • /* 多行注释 */

3. 基础结构

// 程序所属包
package main
// 导入依赖包
import "fmt"
// 常量定义
const NAME string = "John"
// 全局变量声明与赋值
var name string = "Bob"
// 一般类型声明
type typeInt int
// 结构声明
type Learn struct { }
// 接口声明
type ILeran interface { }
// 函数定义
func learnFoo() {
    fmt.Println("learn foo")
}

// main()函数
func main() {
    fmt.Println("simple demo")
    fmt.Println(NAME)
    fmt.Println(name)

    learnFoo()
}

运行结果

simple demo
John
Bob
learn foo

Process finished with exit code 0

4. Package用法

  • package是最基本的分发单位工程管理中依赖关系的体现
  • 每个GO语言源代码文件开头都拥有一个package声明,表示源码文件所属代码包。
  • 要生成GO语言可执行程序,必须要有main的package包,且必须在该包下有main()函数。
  • 同一个路径下只能存在一个package,一个package可以拆分成多个源文件组成。
  • 建议package名称和目录名称一致
  • 同一路径下只能有同一个package名

5.1 import用法

  • 可以导入源代码文件所依赖的package包。
  • 不得导入源代码文件中没有用到的package,否则会编译错误。
  • 两种格式:
import "package1"
import "package2"
...
import (
    "package1"
    "package2"
    ...
)

导入未使用包,会抛出如下错误:

import-demo\import-demo.go:5:2: imported and not used: "time"

Compilation finished with exit code 2
  • 如果一个main导入其它包,包将被顺序导入。
  • 如果导入的包中依赖其它包(包B),会首先导入包B,然后初始化包B中的常量和变量,最后如果包B中有init,会自动执行init(),然后回到main中。
  • 所有包导入完成后才会对main中常量和变量进行初始化,然后执行main中的init函数,最后执行main函数。
  • 如果一个包被导入多次,则该包只会被导入一次。

import顺序

import-demo.go

package main

import (
    "fmt"
    "./src/show"
    "./src/learn"
    )

// 所有依赖包初始化完成后
// 才执行main的初始化函数
func init() {
    fmt.Println("import-demo init")
}

func main() {
    // learn的init函数只执行了一次
    // 可知多次导入只被导入一次
    learn.Learn()
    show.Show()
    fmt.Println("Hello world")
}

show/show.go

package show

import (
    "fmt"
    "../learn"
)

func init() {
    fmt.Println("show init")
}

func Show() {
    learn.Learn()
    fmt.Println("show func")
}

learn/learn.go

package learn

import "fmt"

func init() {
    fmt.Println("learn init")
}

func Learn() {
    fmt.Println("learn func")
}

然后我们运行import-demo.go,可见执行结果:

learn init
show init
import-demo init
learn func
learn func
show func
Hello world

Process finished with exit code 0

5.2 import别名

  • 将导入的包命名为另一个容易记忆的别名。
  • 点(.)标识的包导入后,调用改包中的函数时可以省略前缀包名。
  • 下划线(_)表示导入该包,但不导入整个包,而是执行该包中的init函数,因此无法通过包名来调用包中的其它函数。使用下划线操作往往是为了注册包里的引擎,让外部可以方便的使用。

别名

import (
    myFmt "fmt"
)

未完待续...

猜你喜欢

转载自www.cnblogs.com/jehorn/p/9437664.html