源代码
题外话,做这个主要是给自己看,留下一些思考的痕迹。写代码写注释是个好习惯。
包主要是封装一些功能,就好像一辆车有许多零件,如果一个程序都写在一个文件里,那么这个文件或许能达到无穷量级的代码,这个时候,就要将功能分开来,然后拼接成完整的程序。
-
package 包的定义及其引用
一个文件夹下面是不允许出现多个包的,所以 main 包里面只能有
package main
, 所以我们应该对新的包新建一个文件夹,然后把包放在里面。后续会了解一些规范性的框架package person import ( "errors" "strconv" ) // 首字母大写 可以被外部调用 如果首字母是小写的 那么是私有的 无法被调用 func PersonInfo(name string, age int) (string, error) { if name == "" { return "", errors.New("name can not be empty") } else if age <= 0 || age > 100 { return "", errors.New("wrong age") } // 这里强转了一下 age return "name:" + name + ",age:" + strconv.Itoa(age), nil }
package main import ( "errors" // 这样就不需要使用 fmt. 来调用Println // . "fmt" "fmt" "strconv" // 这里导包 可以直接用 ./ 点斜杠 不知道为啥不会自动导入 // p是别名 //p "" ) /* 这玩意是默认存在的 这里显性地展示出来 在包运行的时候 就会自动执行 就和java的static一样(个人理解) */ func init() { fmt.Println("-------------init() -------------") } // package packageName func main() { /* 包的初始化顺序 1 包级别的变量 2 init()函数 可以匿名导入 import _ 包名 */ // 直接Println 而不是fmt.Println 但是建议别用 fmt.Println("If you shed tears when you miss the sun, you also miss the stars. ") fmt.Println("---------------------------------") // 这里使用了别名 info, err := PersonInfo("Bob", 18) fmt.Println(info) fmt.Println(err) } // 首字母大写 可以被外部调用 func PersonInfo(name string, age int) (string, error) { if name == "" { return "", errors.New("name can not be empty") } else if age <= 0 || age > 100 { return "", errors.New("wrong age") } // 这里强转了一下 age return "name:" + name + ",age:" + strconv.Itoa(age), nil }