golang大小写规则的影响

目录

golang大小写的规则:

1、可见性(visibility):

 2、包的导入和调用:

3、json序列化和反序列化:

4、结构体字段的导出和可见性:

5、方法和函数的导出和可见性 :

6、常量和变量的导出和可见性:

小结:

程序示例说明:

程序输出结果:


golang大小写的规则:

在golang语言中,大小写通常用于指示标志符(如变量名、函数名、方法名、数据类型名)的可见性和访问权限,大小写的影响主要体现在以下几个方面:

1、可见性(visibility):

  • 大写字母开头的标志符表示可导出(exported),可以被外部包引用和访问
  • 小写字母开头的标志符表示不可导出(unexported),不可以被外部包引用和访问

 2、包的导入和调用:

  • 大写字母开头的标志符表示被导出的标志符,可以在其他包中直接使用
  • 小写字母开头的标志符表示私有的,只能在当前包内使用

3、json序列化和反序列化:

  • 大写字母开头的字段在使用encoding/json包进行序列化和反序列化时,会被导出到json中
  • 小写字母开头的字段在使用encoding/json包进行序列化和反序列化时,会被忽略掉

4、结构体字段的导出和可见性:

  • 大写字母开头的字段表示该字段时导出的,可以被其他包访问
  • 小写字母开头的字段表示该字段是私有的,不可导出的,只能在定义该结构体的包内部进行访问

5、方法和函数的导出和可见性 :

  • 大写字母开头的方法名称或者函数名称表示该方法是导出的,可以被其他包调用
  • 小写字母开头的方法名称或者函数名称表示该方法是私有的,只能在定义该方法或者函数的包内部调用,不可以在被其他包调用
  • 这里需要注意的是,是不可以被其他包直接调用,间接也是可以的,比如A包内定义了个大写字母开头的函数Afunc,如何Afunc内调用了A包内的bfunc,那B包内也是可以间接调用A包中的Afunc再调用bfunc的

6、常量和变量的导出和可见性:

  • 大写字母开头的常量或者变量表示导出的,公开的,可以被其他包访问
  • 小写字母开头的常量或者变量表示不可导出的,私有的,只有在定义它们的包的内部访问

小结:

我们在设计一个标识符(变量、常量、结构体类型、函数,方法)时:

大写字母开头:如果这个标识符是导出的,可见的,公共的,可以被其他包访问或者调用的

小写字母开头:如果这个标志符是不可导出的,私有的,只限制当前包访问或调用的

对大小写标志符合理的定义,尽可能地减少全局命名空间的污染、提高代码的可读性和可维护性、可以清晰地表示标志符的可见性和作用范围,减少不必要的暴露,提高代码的封装性和安全性

程序示例说明:

package main

import (
	"encoding/json"
	"fmt"
	"test/pack1"
)

type Person struct {
	Name string
	age  int
}

type strudent struct {
	name string
	age  int
}

type teacher struct {
	Name string
	age  int
}

type mainType struct {
	Name string
}

func (m *mainType) mainMethod() {
	fmt.Println("this private function in main")
}

func main() {

	person := Person{
		Name: "Same",
		age:  20,
	}
	data1, err := json.Marshal(person)

	if err != nil {
		fmt.Println("Json Marshal person error:", err)
		return
	}
	fmt.Println(string(data1)) //{"Name":"Same"}

	stu := strudent{
		name: "lee",
		age:  22,
	}
	data2, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("Json MarShal student error:", err)
		return
	}
	fmt.Println(string(data2)) //{}    小写字母开头的字段是忽略的

	tea := teacher{
		Name: "Joo",
		age:  35,
	}
	data3, err := json.Marshal(tea)
	if err != nil {
		fmt.Println("Json MarShal teacher error:", err)
		return
	}

	fmt.Println(string(data3)) //{"Name":"Joo"}  大写字母开头的字段被解析,小写字母开头的字段名是忽略的

	//main包访问pack1包内定义的大写字母开头的变量,可行的
	fmt.Println(pack1.PublicVar1)

	//main包调用pack1包定义的小写字母开头的变量,是未定义的
	//fmt.Println(pack1.privateVar1)
	//undefined: pack1.privateVar1

	//main包调用pack1包内定义的大写字母开头的函数,是可行的
	pack1.PublicFunction()

	//调用其他包定义的小写字母开头的函数,是未定义的
	//pack1.privateFunction
	// undefined: pack1.privateVar1

	s := pack1.StructType{Name: "Lily"}
	s.PublicMethod()

	//调用其他包定义的小写字母开头的方法,是未定义的
	//s.privateMethod()
	//s.privateMethod undefined

	//main 包的方法可以被直接调用的
	m := mainType{Name: "meimei"}
	m.mainMethod()
}

程序输出结果:

{"Name":"Same"}
{}
{"Name":"Joo"}
10
Public function
Public Method
this private function in main

 

相关推荐

  1. golang大小写规则影响

    2024-04-02 00:28:02       43 阅读
  2. golang 规则引擎gengine

    2024-04-02 00:28:02       67 阅读
  3. threejs WebGLRenderer 像素比对画布大小影响

    2024-04-02 00:28:02       64 阅读
  4. golang编程规范

    2024-04-02 00:28:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 00:28:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 00:28:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 00:28:02       87 阅读
  4. Python语言-面向对象

    2024-04-02 00:28:02       96 阅读

热门阅读

  1. [UTCTF 2024] crypto 部分

    2024-04-02 00:28:02       28 阅读
  2. 2023版IDEA常用快捷键 【非常全】

    2024-04-02 00:28:02       32 阅读
  3. 【C/C++】C语言实现队列(循环队列+链式队列)

    2024-04-02 00:28:02       27 阅读
  4. vue.router和vue.route

    2024-04-02 00:28:02       35 阅读
  5. vue 插槽(二)

    2024-04-02 00:28:02       40 阅读
  6. 前端Vue根据List中的某个字段排序

    2024-04-02 00:28:02       36 阅读
  7. linux 没有rc.local文件的解决方法

    2024-04-02 00:28:02       32 阅读