13.源文件间结构组织

予早 2024-12-19 23:53:47
Categories: Tags:

Go中每一个文件属于一个包

标准目录结构

go-root-name
  src
    project-name
     dir1
     dir2
     dir3
package "demo" //打包
import "demo" //导包
import(
    "demo1"
    "demo2"
    demo3 "demo3"
)
import packageAlias "package" //导包并设置包的别名,但原来的名字就不能再使用
  1. package、namespace
  2. 尽量保持目录名与包名一致,当然可以不一样
  3. 访问权限控制,首字母大写表示公有,可以被其他包访问,首字母小写表示私有,只能被本包使用
  4. import导包包名需要使用双引号包裹,因为本质上是路径,默认根为GOROOT/src/,使用/进行分隔,其中GOROOT为环境变量(对,就是高级系统设置、环境变量,只是IDE会自动本地维护)
  5. main函数只能在main包下,否则会报错,cannot run non-main package
  6. 一个目录下的同级别go源文件只能属于同一个包
  7. 导包时可以设置包的别名,但是设置别名后原名不能再使用

init函数

package main

import (
    "fmt"
    "gocode/testproject01/unit5/demo10/testutils"
)

var Num int = test()

func test() int {
    fmt.Println("test函数被执行")
    return 10
}

func init() {
    fmt.Println("main.go中的init函数被执行!")
}

func main() {
    fmt.Println("main函数被执行!")
    fmt.Printf("Age= %d, Sex= %s, Name= %s\n", testutils.Age, testutils.Sex, testutils.Name)
}

这段代码的执行流程如下:

  1. testutils中的全局变量初始化,init函数调用
  2. 程序开始执行,首先会初始化全局变量Num,这会调用test()函数。
  3. test()函数中,打印出”test函数被执行”,然后返回10,这个值被赋给Num
  4. 接着,main.go中的init函数被执行,打印出”main.go中的init函数被执行!”。
  5. 然后,程序执行main函数,打印出”main函数被执行!”。
  6. 最后,使用fmt.Printf打印出testutils包中的AgeSexName变量的值。

go中已package组织源码,每个包即一个文件夹,包中可以包含若干go文件,包中的每个go文件必须声明package name且保证包名一致

main包比较特殊,其定义一个独立可执行程序,main包中的main函数为整个程序的执行入口,其他包中的main仅仅是一个普通函数