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

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.1):隐藏结构体与跨包引用结构体相关的知识,希望对你有一定的参考价值。

很多时候,我们不应该把某包(如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

以上是关于go语言学习笔记 — 基础 — 复合数据类型 — 结构体(10.1):隐藏结构体与跨包引用结构体的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:使用匿名结构体分离json数据

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:如何在包中引用另外一个包的结构体?

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:类型内嵌与结构体内嵌(扩展和复用)

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:构造函数 — 封装结构体和类型的一系列初始化操作(封装数据)

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

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