跳过正文
  1. 博客文章/

Go 语言结构体(Struct)详解与实践

·268 字·2 分钟·
编程语言 Golang Struct 面向对象
Zayn
作者
Zayn
专注 Kubernetes、CI/CD、可观测性等云原生技术栈,记录生产环境中的实战经验与踩坑复盘。
目录

Go 语言中的结构体(Struct)是一种用户自定义的数据类型,用于将不同类型的数据组合在一起。虽然 Go 不是传统的面向对象语言,但通过结构体和方法,我们可以实现面向对象编程的核心概念。

什么是结构体
#

结构体是 Go 语言中实现数据封装的主要方式,它具有以下特点:

  • 数据聚合: 将相关的数据字段组合在一起
  • 类型安全: 编译时检查字段类型
  • 方法绑定: 可以为结构体定义方法
  • 内存效率: 字段在内存中连续存储

基础结构体定义
#

简单结构体示例
#

让我们通过一个图书管理的例子来学习结构体的使用:

package main

import "fmt"

// Book 定义图书结构体
type Book struct {
    id      int    // 图书ID
    title   string // 书名
    author  string // 作者
    subject string // 主题
}

构造函数模式
#

在 Go 中,通常使用工厂函数来创建结构体实例,这是一种最佳实践:

// NewBook 创建新的图书实例(构造函数)
// 使用 New 开头的函数名是 Go 的约定
func NewBook(id int, title, author, subject string) *Book {
    return &Book{
        id:      id,
        title:   title,
        author:  author,
        subject: subject,
    }
}

设计说明:

  • 返回指针类型 *Book 避免不必要的内存拷贝
  • 使用具名字段初始化提高代码可读性
  • 构造函数可以添加参数验证逻辑

方法定义
#

为结构体定义方法来实现行为:

// String 实现 fmt.Stringer 接口,用于格式化输出
func (book *Book) String() string {
    return fmt.Sprintf("ID: %d, 书名: %s, 作者: %s, 主题: %s",
        book.id, book.title, book.author, book.subject)
}

// GetTitle 获取书名(Getter 方法)
func (book *Book) GetTitle() string {
    return book.title
}

// SetTitle 设置书名(Setter 方法)
func (book *Book) SetTitle(title string) {
    if title == "" {
        fmt.Println("警告: 书名不能为空")
        return
    }
    book.title = title
}

// GetInfo 获取图书详细信息
func (book *Book) GetInfo() map[string]interface{} {
    return map[string]interface{}{
        "id":      book.id,
        "title":   book.title,
        "author":  book.author,
        "subject": book.subject,
    }
}

辅助函数
#

// printBook 打印图书信息的辅助函数
func printBook(book *Book) {
	fmt.Printf("id=%d,title=%s,author=%s,subject=%s\n",
		book.id, book.title, book.author, book.subject)
	book.id = 1000
}

func main() {
	var book1 *Book
	book1 = new(Book)
	book1.id = 1001
	book1.title = "go in action"
	book1.author = "james"
	book1.subject = "about golang"
	fmt.Println(book1)

	fmt.Println(book1.String())

	book2 := Book{
		id:      1002,
		title:   "python in action",
		author:  "jordan",
		subject: "about python",
	}
	// book2 := Book{
	// 	1002,
	// 	"python in action",
	// 	"jordan",
	// 	"about python",
	// }
	fmt.Println(book2)

	fmt.Println("book2.title=", book2.title)

	printBook(&book2)
	fmt.Println(book2)
	fmt.Println(book2.String())

	book3 := NewBook(1004, "Java", "gsl", "Java in action")
	fmt.Println(book3.String())
}

相关文章

使用 Docker Compose 5分钟 部署 一台邮件服务器
·723 字·4 分钟
Docker Email Install Dokcer-Compose
K3s 集群修改 Flannel CNI 插件网络模式
·418 字·2 分钟
K3s Openwrt 网络 Flannel N1 Linux
Nexus3 PyPI 私服 Blob Storage 异常修复记录
·260 字·2 分钟
DevOps Nexus3 Fix Pypi Jenkins Pipeline