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

本文介绍了Go语言中结构体的封装原则,强调了小写字母开头的结构体在其他包中不可见。为了跨包创建和使用这些私有结构体,可以提供一个导出的构造函数。示例中展示了如何在`abc`包内创建`animal`结构体的实例,并在`main`包中通过`NewAnimal()`函数进行访问。虽然结构体的私有字段无法直接设置,但可以通过方法来间接操作。
摘要由CSDN通过智能技术生成

很多时候,我们不应该把某包(如abc)中的struct(如animal)直接暴露给其它包,暴露意味着打开了那个"黑匣子",所以结构体一般会以小写字母开头,对于跨包代码(package声明不同)是隐藏的,不会被导出。

  • 错误示例

结构体一般会以小写字母开头,在外界其它包中构建包abc的结构体animal,就没法直接通过以下几种方式实现:

var xxx abc.animal

new(abc.animal)

&abc.animal{...}

abc.animal{...}

abc/abc.go文件内容:

package abc

type animal struct{
    name string
    Speak string
}

main.go内容

package main

import "./abc"

func main() {
    // 全都错误
    var t1 abc.animal
    t2 := new(abc.animal)
    t3 := &abc.animal{}
    t4 := abc.animal{}
}
  • 正确导入其他包中的结构体

如何在外界构建隐藏结构体的实例?这时可以在abc包中写一个可导出的函数,其他包的代码可以通过这个函数,跨包来构建struct实例。例如:abc/abc.go文件内容

package abc

type animal struct{
    name string   // animal中的成员字段name不可导出
    Speak string
}

func NewAnimal() *animal{  // 返回结构体animal实例的指针
    a := new(animal)
    return a
}

在main.go中,跨包引用隐藏的结构体animal

package main

import (
    "fmt"
    "./abc"
)

func main() {
    t1 := abc.NewAnimal()
    // t1.name = "haha"  
    t1.Speak = "hhhh"
    fmt.Println(t1.Speak)
}

因为animal中的首字母小写成员字段name不可导出,无法访问隐藏成员字段name,没法为其赋值。换句话说,name属性永远是初始化值0。因此,在构建结构体实例时,需要自定义设置隐藏成员属性name,并且获取它的值。

  • 参考文章
    https://www.cnblogs.com/f-ck-need-u/p/9887233.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值