go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.2):自定义设置隐藏的成员属性,并获取它的值
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.2):自定义设置隐藏的成员属性,并获取它的值相关的知识,希望对你有一定的参考价值。
1. 方法一:定义函数,设置赋给隐藏属性的参数,并在结构体上绑定获取隐藏属性的方法
修改NewAnimal()函数:abc/abc.go文件内容
package abc
type animal struct{
name string // animal中的成员字段name不可导出
Speak string
}
// 绑定可导出的方法,用于外界包获取实例的成员字段name
func (a *animal) GetName() string {
return a.name
}
// 通过形参初始化隐藏的结构体成员字段,返回结构体animal实例的指针
func NewAnimal(name string) *animal{
a := new(animal)
a.name = name
return a
}
在main.go中,跨包引用隐藏的结构体animal
package main
import (
"fmt"
"./abc"
)
func main() {
t1 := abc.NewAnimal("yjk")
fmt.Println(t1.GetName()) // 通过导出方法获取实例的成员属性name
// t1.name = "haha"
t1.Speak = "hhhh"
fmt.Println(t1.Speak)
}
2. (最好)方法二:在结构体上,绑定设置隐藏成员属性的方法,并绑定获取隐藏成员属性的方法,两个方法都可导出
abc/abc.go文件内容
package abc
type animal struct{
name string // animal中的成员属性name不可导出
Speak string
}
// 绑定可导出的方法,用于设置实例的成员属性name
func (a *animal) SetName(name string){
a.name = name
}
// 绑定可导出的方法,用于外界包获取实例的成员属性name
func (a *animal) GetName() string {
return a.name
}
// 定义函数,返回结构体animal实例的指针
func NewAnimal() *animal{
a := new(animal)
return a
}
在main.go中,跨包引用隐藏的结构体animal
package main
import (
"fmt"
"./abc"
)
func main() {
t1 := abc.NewAnimal()
t1.SetName("yjk")
fmt.Println(t1.GetName()) // 通过导出方法获取实例的成员属性name
t1.Speak = "hhhh"
fmt.Println(t1.Speak)
}
运行、构建测试
# go run main.go
yjk
hhhh
现在,abc/abc.go中的结构体animal完全对外隐藏了。但需要注意的是,上面的setter类方法SetName()不能同时被2个或多个线程修改,否则值被覆盖,出现线程安全问题,可以使用sync包或者goroutine和channel来解决这个问题。
以上是关于go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.2):自定义设置隐藏的成员属性,并获取它的值的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 复合数据类型 — 结构体:使用匿名结构体分离json数据
go语言学习笔记 — 基础 — 复合数据类型 — 结构体:如何在包中引用另外一个包的结构体?
go语言学习笔记 — 基础 — 复合数据类型 — 结构体:类型内嵌与结构体内嵌(扩展和复用)
go语言学习笔记 — 基础 — 复合数据类型 — 结构体:构造函数 — 封装结构体和类型的一系列初始化操作(封装数据)