Golang笔记-大小写作用范围

验证作用范围所使用的目录结构:
Golang笔记-大小写作用范围_第1张图片
其中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

你可能感兴趣的:(golang)