Hello World

package main

import "fmt"

func main(){
    fmt.Println("hello world")
}

为了更好的组织代码提供的一个概念.把功能相关的文件组织在一个包中,方便使用和查找.

包的习惯用法:

  1. 包名一般小写.
  2. 包名一般和目录相同(虽然可以不同)
  3. 包名不能包含 -
  4. 包一般使用域名作为顶级包名.github.com/go-sql-driver/mysql

包的导入

import "包的路径"

单行导入

import "fmt"

import github.com/go-sql-driver/mysql

多行导入

import (
    "fmt"
    "time"
)

main 包

入口包.

go 语言中, 同时满足 main 包与 main() 函数, 才会被编译为可执行文件.

参考 Hello World 的代码.

main 包下方法调用

package main

import "fmt"

func main(){
    Hello()
    fmt.Println("hello world")
}
package main

import "fmt"

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

此时执行命令go run main.go 会报错

$ go run main.go
# command-line-arguments
.\main.go:15:2: undefined: Hello

应该使用命令 go run *.go

init() 函数

在导入包时会自动触发包内部的init()函数, 该函数没有参数也没有返回值.不能被其他函数调用.

//  执行导入包后执行 init 函数,然后执行 main 函数
package main

import "fmt"

var i int = 1

func init(){
    fmt.Println("main init:",i)
}
func main(){
    fmt.Println("hello world")
}
$ go run main.go
main init: 1
hello world
image.png

init() 执行顺序

main.go 依次 导入 a.go aa.go b.go

package main

import (
    "fmt"
    
    "github.com/go-study/a"
    "github.com/go-study/aa"
    "github.com/go-study/b"
)

var i int = 1

func init() {
    fmt.Println("main init:", i)
}

func main() {
    fmt.Println("hello world")
    a.A()
    aa.AA()
    b.B()
}
package aa

import "fmt"

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

func AA() {
    fmt.Println("AA")
}
package a

import "fmt"

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

func A() {
    fmt.Println("A")
}
package b

import "fmt"

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

func B() {
    fmt.Println("B")
}

输入结果

$ go run main.go
a init
aa init
b init
main init: 1
hello world
A
AA
B

init 执行顺序是根据 导入包的顺序.来执行 init() 函数

a.init() --> aa.init() --> b.init() -- main.init()

main.go 导入 a.go

a.go 导入 aa.go

aa.go 导入 b.go

package main

import (
    "fmt"

    "github.com/go-study/a"
)

var i int = 1

func init() {
    fmt.Println("main init:", i)
}

func main() {
    fmt.Println("hello world")
    a.A()
}
package a

import (
    "fmt"

    "github.com/go-study/aa"
)

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

func A() {
    fmt.Println("A")
    aa.AA()
}

package aa

import (
    "fmt"

    "github.com/go-study/b"
)

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

func AA() {
    fmt.Println("AA")
    b.B()
}

package b

import "fmt"

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

func B() {
    fmt.Println("B")
}

输出结果

b init
aa init
a init
main init: 1
hello world
A
AA
B

导入顺序

导入顺序

执行顺序

执行顺序

可见性

go 语言中并没有像 Java 中 public private 这类的权限修饰符. 而是将标识符首字母大写则对外可见.(包外)

package user

// 该 结构体 包外不可见.只能本包内使用.
// 一般 IDE 会提示警告.
type user struct {
    username string
}

// 该 结构体 包外可见.
type Person struct {
    // Name 字段包外可见
    Name string 
    // age 字段包外不可见
    age  uint8
}
// 该 方法 包外可见
func Add (a,b int) int{
    return a+b
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.包的概述 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便...
    楚江云阅读 706评论 0 1
  • 8.1 创建包package 包要求在同一个目录下的所有文件的第一行添加如下代码,以标记该文件归属的包: 包的特性...
    Benedict清水阅读 241评论 0 0
  • 包是结构化代码的一种方式:每个程序都由包的概念组成,可以使用自身的包或者从其它包中导入内容。 一、工作空间 编译⼯...
    学生黄哲阅读 2,179评论 1 15
  • 1. Go语言包的概念 Go语言使用包来组织源代码的,并实现命名空间的管理,任何一个Go语言程序必须属于一个包,即...
    VienFu阅读 3,370评论 0 1
  • 包package是源码(.go文件)的集合。 注意: 一个文件夹下面只能有一个包,同样一个包的文件不能改在多个文件...
    Cici冬雪阅读 689评论 0 0