《Go语言实战》读书笔记——公开或未公开的标识符

 一、包里未公开的标识符

Go语言支持从包里公开或者隐藏标识符。通过这个功能,让用户能按照自己的规则控制标识符的可见性。

 这个就类似于Java当中的权限修饰符private、public,只是golang当中是使用对变量名首字母大小写来控制其的可访问性。

package counters

type alertCounter int
package main

import (
	"fmt"
	"counters"
)

// main 是应用程序的入口
func main() {
	// 创建一个未公开的类型的变量
	// 并将其初始化为 10
	counter := counters.alertCounter(10)

	fmt.Printf("Counter: %d\n", counter)
}

 上述的代码会运行错误

只要将自定义类型的首字母改成大写就可以正常初始化了

或者我们可以使用一个工厂函数对其进行初始化

package counters

type alertCounter int

func New(value int) alertCounter{
	return alertCounter(value)
}
package main

import (
	"fmt"
	"counters"
)

// main 是应用程序的入口
func main() {
	// 创建一个未公开的类型的变量
	// 并将其初始化为 10
	counter := counters.New(10)

	fmt.Printf("Counter: %d\n", counter)
}

二、 结构里的不可见字段

package entities

// User 在程序里定义一个用户类型
type User struct {
	Name string
	email string
}
package main

import (
	"fmt"
	"entities"
)

 // main 是应用程序的入口
func main() {
 	// 创建 entities 包中的 User 类型的值
 	u := entities.User{
 		Name: "Bill",
 		email: "bill@email.com",
 	}
 	// ./example69.go:16: 结构字面量中结构 entities.User
 	// 的字段’email’未知
	fmt.Printf("User: %v\n", u)
}

上述例子只需要将email改成首字母大写即可

三、公开和未公开的内嵌类型

package entities

// user 在程序里定义一个用户类型
type user struct {
	Name string
	Email string
}

// Admin 在程序里定义了管理员
type Admin struct {
	user // 嵌入的类型是未公开的
	Rights int
}
package main

import (
	"fmt"
	"entities"
)

// main 是应用程序的入口
func main() {
	// 创建 entities 包中的 Admin 类型的值
	a := entities.Admin{
		Rights: 10,
	}
	// 设置未公开的内部类型的
	// 公开字段的值
	a.Name = "Bill"
	a.Email = "bill@email.com"
	fmt.Printf("User: %v\n", a)
}

由于内部类型 user 是未公开的,这段代码无法直接通过结构字面量的方式初始化该内部类型。不过,即便内部类型是未公开的,内部类型里声明的字段依旧是公开的。既然内部类型的标识符提升到了外部类型,这些公开的字段也可以通过外部类型的字段的值来访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值