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语言学习笔记 — 基础 — 复合数据类型 — 结构体:构造函数 — 封装结构体和类型的一系列初始化操作(封装数据)

go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.2):自定义设置隐藏的成员属性,并获取它的值

go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.1):隐藏结构体与跨包引用结构体