作者: EricDD | 来源:发表于2021-11-11 17:26 被阅读0次

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、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • Golang-基础包

    math包 strconv包 json包 time包

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • npm使用手册

    目录 # 包的管理# ----》创建包# ----》安装包# ----》删除包# ----》发布包# ----》更...

  • 生信小组DAY6-JANE

    R包R语言的包,常常听到各种名字,扩展包、程序包、软件包、函数包、算法包……不如单名一个“包(Package)”字...

  • “包治百病”却拯救不了你的“烂人生”

    1. 包个包个包包那是什么包 包个包个包包这个害人包 一包一包一包包包催人傻 妙龄青春女孩已经犯错了!!! 包是什...

  • linux 指南II 软件安装

    包全名与包名包全名:操作的包是没有安装的软件包时,使用包全名。而且要注意路径包名: 操作已经安装的软件包时,使用包...

  • linux 安装命令管理

    包全名与包名包全名:操作的包是没有安装的软件包时,使用包全名而且要注意路径包名: 操作已经安装的软件包,使用包名 ...

  • 构建CentOS httpd RPM包

    安装依赖包 下载apr及httpd源码包 编译apr rpm包 安装apr包 编译http包 安装http包

  • 全网最详细的游戏包解读:小白也能看懂

    一.游戏包的概念: 目前的游戏包大部分是大家所熟知的下载包,像官方包,企业包(官网包),吸量包,联运包 当然现在有...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/jtdgzltx.html