0

0

如何在 Go 中通过结构体实例访问其字段

心靈之曲

心靈之曲

发布时间:2026-01-22 19:18:21

|

102人浏览过

|

来源于php中文网

原创

如何在 Go 中通过结构体实例访问其字段

go 中,可通过点号(`.`)操作符直接访问结构体指针或值实例的导出字段,前提是字段名首字母大写;未导出字段(小写开头)仅能在定义该结构体的包内访问。

要从函数(包括顶层函数、其他包函数或方法)中访问 Graph 实例的字段,关键在于字段的可见性(exported/unexported)访问方式(值 vs 指针)

✅ 正确前提:字段必须是导出的(首字母大写)

您原始代码中定义的字段 nodes 和 adjList 均为小写开头(nodes, adjList),属于未导出字段(unexported),这意味着:

  • 它们只能在定义 Graph 的同一个包内被直接访问
  • 即使是同一包内的普通函数(非方法),也可以通过 instance.fieldName 访问;
  • 其他包无法直接读写这些字段,必须通过导出的方法(如 Nodes(), SetNodes(...))间接操作。

因此,若需跨包或更规范地使用,应将字段改为导出形式:

FreeTTS
FreeTTS

FreeTTS是一个免费开源的在线文本到语音生成解决方案,可以将文本转换成MP3,

下载
type Graph struct {
    Nodes   []int     // ✅ 导出字段:可被其他包访问
    AdjList map[int][]int // ✅ 同样导出
}

? 访问实例字段的语法(无论是否为方法)

假设 aGraph := New() 返回 *Graph(即结构体指针),以下访问方式均合法(在同包内):

func exampleFunc(g *Graph) {
    // ✅ 直接读写导出字段(同包内)
    fmt.Println("Nodes:", g.Nodes)
    g.Nodes = append(g.Nodes, 42)

    // ✅ 访问 map 字段并赋值
    if g.AdjList == nil {
        g.AdjList = make(map[int][]int)
    }
    g.AdjList[42] = []int{1, 2, 3}

    // ⚠️ 若字段未导出(如 nodes/adjList),此处编译报错:cannot refer to unexported field
}
? 提示:Go 允许对 *Struct 使用 inst.field(无需解引用),编译器会自动处理指针解引用——这是语言的便利设计。

? 常见错误与注意事项

  • ❌ aGraph.nodes 在其他包中会编译失败:cannot refer to unexported field nodes
  • ❌ 对 nil map 直接赋值(如 aGraph.AdjList[0] = ...)会 panic;务必先初始化:aGraph.AdjList = make(map[int][]int)
  • ✅ 推荐实践:为未导出字段提供导出的 Getter/Setter 方法,以封装逻辑和保障数据一致性:
func (g *Graph) NodeCount() int {
    return len(g.Nodes)
}

func (g *Graph) AddNode(n int) {
    g.Nodes = append(g.Nodes, n)
}

✅ 完整可运行示例(同包内直接访问)

package main

import "fmt"

type Graph struct {
    Nodes   []int
    AdjList map[int][]int
}

func New() *Graph {
    return &Graph{
        AdjList: make(map[int][]int),
    }
}

func main() {
    aGraph := New()

    // 直接访问导出字段
    aGraph.Nodes = []int{1, 2, 3}
    aGraph.AdjList[0] = []int{10, 20}
    aGraph.AdjList[1] = []int{30}

    fmt.Printf("Graph: %+v\n", aGraph)
    // 输出:Graph: &{Nodes:[1 2 3] AdjList:map[0:[10 20] 1:[30]]}
}

总结:访问结构体实例字段的核心是——确保字段导出 + 使用点号操作符 + 注意 nil 安全。合理设计字段可见性与配套方法,是构建健壮 Go API 的基础。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号