验证作用范围所使用的目录结构:
其中main.go内容如下:
package main
import (
"encoding/json"
"fmt"
"practice/mulu1"
"practice/mulu2"
"practice/mulu4"
)
//1.即使mulu1下的Plus是首字母大写,这里也要导入包;但如果Plus是首字母小写,导包plus也语法不可用
//2.导包的路径是实际的文件系统目录,而首字母大小写可见范围所针对的包是指go文件首行package关键字后面的跟随包名:“package notmulu1”
//3.两个go文件在不同目录设置相同包名,即mulu1.go和mulu4.go中都为package notmulu1,会报重复声明错误。
//4.两个go文件在相同目录下使用不同的包名,即mulu1下的mulu1.go和mulu11.go.中分别为package notmulu1和notmulu11,语法也不通过。
//5.两个go文件在相同目录下使用相同的包名,则可行,如mulu1下的mulu1.go和mulu11.go.中都为package notmulu1。
type fish struct {
a int
bbbbb string
Cccccc byte //`json:"ccc"`
D map[string]int //`json:"ddd"`
}
func main() {
c := notmulu1.Plus(1, 2)
// _ = mulu1.plus(2, 2)//不可用
d := mulu2.Minus(3, 1)
e := notmulu2.Div(4, 2)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
//6.Bird结构体在mulu2包里,如果首字母小写bird,则这里报错,不可见
aa := mulu2.Bird{
Bbbbbb: "2",
Cccccc: '3',
//7.Bird成员D如果小写,则会报错,“结构体Bird里没有这个成员”,不可见
// d: map[string]int{"a": 1, "b": 2},
D: map[string]int{"a": 1, "b": 2},
}
// check cache!!
ledger, ok := aa.D["c"]
if ok {
fmt.Println(ledger)
}
// ledger := aa.d["a"]
// fmt.Println(ledger)
fmt.Println(aa)
//8.fish的成员以小写字母开头的,序列化之后会丢失这个成员
bb := fish{
a: 1,
bbbbb: "2",
Cccccc: '3',
D: map[string]int{"a": 1, "b": 2},
}
b, err := json.Marshal(bb)
if err != nil {
fmt.Println("err:", err.Error())
}
fmt.Println(string(b))
}
//总结:golang的命名需要使用驼峰命名法,且不能出现下划线
//无论是方法名、常量、变量名还是结构体的名称(包括其成员),如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。
//结构体成员首字母小写,则在序列化的时候会丢失该成员
//不同目录下使用不同包名,相同目录下使用相同包名,包名指的是go文件首行的paceage packagename