【Golang星辰图】数据驱动的应用:实现Excel、数据库、图数据库和RPC的最佳选择

news/2024/4/29 16:52:36/文章来源:https://blog.csdn.net/qq_42531954/article/details/137110675

从数据到服务:使用Go语言顶级库处理Excel、数据库和RPC

前言:

Go语言拥有丰富的开源库生态系统,提供了许多功能强大的库,可以帮助开发者更高效地处理各种任务和问题。本文将介绍几个扩展Go语言功能的重要库,涵盖了Excel文件处理、键值对数据库、嵌入式数据库、图数据库以及RPC等方面的库。通过阅读本文,您将了解这些库的特性、使用方法和实践经验,以便在开发过程中做出最佳的选择。

欢迎订阅专栏:Golang星辰图

文章目录

  • 从数据到服务:使用Go语言顶级库处理Excel、数据库和RPC
    • 前言:
    • 第一章:go-xlsx - Excel文件处理库
      • 1.1 go-xlsx简介
        • 1.1.1 go-xlsx的特性
        • 1.1.2 go-xlsx的应用场景
      • 1.2 go-xlsx的核心功能
        • 1.2.1 Excel文件读取
        • 1.2.2 Excel文件写入
        • 1.2.3 Excel文件内容操作与管理
    • 第二章:go-leveldb - 键值对数据库库
      • 2.1 go-leveldb简介
        • 2.1.1 LevelDB背景信息
        • 2.1.2 go-leveldb库的功能特点
      • 2.2 go-leveldb操作实践
        • 2.2.1 数据插入与更新
        • 2.2.2 数据查询与删除
        • 2.2.3 库的性能优化与注意事项
    • 第三章:go-bolt - 嵌入式键值对数据库库
      • 3.1 go-bolt简介
        • 3.1.1 Bolt数据库基础
        • 3.1.2 go-bolt的主要优势
      • 3.2 go-bolt功能与操作
        • 3.2.1 创建与打开数据库
        • 3.2.2 键值对的基本CRUD操作
        • 3.2.3 数据库事务与并发控制
    • 第四章:go-orientdb - OrientDB图数据库库
      • 4.1 go-orientdb概述
        • 4.1.1 OrientDB数据库特性
        • 4.1.2 go-orientdb库的主要功能
      • 4.2 go-orientdb在OrientDB上的应用
        • 4.2.1 图数据库的创建与连接
        • 4.2.2 数据模型构建与查询操作
        • 4.2.3 高级功能探索:图遍历与数据分析
    • 第五章:go-sqlite3 - 用于SQLite数据库的绑定库
      • 5.1 go-sqlite3简介
        • 5.1.1 SQLite数据库简介
        • 5.1.2 go-sqlite3库的功能概览
      • 5.2 go-sqlite3操作与实践
        • 5.2.1 连接与初始化SQLite数据库
        • 5.2.2 使用SQL语句进行CRUD操作
        • 5.2.3 支持高级特性:事务、预编译语句、数据库迁移
    • 第六章 grpc-go:gRPC库
      • 6.1 grpc-go简介
        • 6.1.1 gRPC协议及原理
        • 6.1.2 grpc-go库的功能与地位
      • 6.2 grpc-go的使用与开发
        • 6.2.1 定义服务接口与消息结构
        • 6.2.2 实现服务端与客户端
        • 6.2.3 负载均衡、身份认证和错误处理机制
    • 总结:

第一章:go-xlsx - Excel文件处理库

1.1 go-xlsx简介

go-xlsx是一个用于处理Excel文件的Go语言库。它旨在提供易于使用和高效的功能。

1.1.1 go-xlsx的特性
  • 支持读取和解析各种格式的Excel文件,如.xlsx和.xls。
  • 支持写入和生成自定义格式和样式的Excel文件。
  • 对单元格数据进行操作,包括读取和写入值、公式和格式设置。
  • 支持对工作表进行操作,包括创建、删除和重命名工作表。
1.1.2 go-xlsx的应用场景

go-xlsx可以在多种需要处理Excel文件的场景中使用。常见的应用包括:

  • 将数据导入和导出Excel文件。
  • 生成报表和摘要以Excel格式呈现。
  • 从现有的Excel文件中提取数据进行分析和处理。
  • 创建和更新用于数据录入的Excel模板。

1.2 go-xlsx的核心功能

在本节中,我们将详细探讨go-xlsx的核心功能。

1.2.1 Excel文件读取

go-xlsx提供了读取和解析Excel文件的函数。您可以指定文件路径,并将文件内容读取到可以轻松处理的结构化格式中。

以下是使用go-xlsx读取Excel文件的示例代码:

package mainimport ("fmt""github.com/360EntSecGroup-Skylar/excelize"
)func main() {// 打开Excel文件f, err := excelize.OpenFile("example.xlsx")if err != nil {fmt.Println(err)return}// 读取第一个工作表的数据rows, err := f.GetRows("Sheet1")if err != nil {fmt.Println(err)return}// 处理每一行数据for _, row := range rows {// 对数据进行处理fmt.Println(row)}
}

在上面的示例中,我们使用excelize包打开名为"example.xlsx"的Excel文件,并从名为"Sheet1"的第一个工作表读取数据。然后我们遍历每一行,并打印行数据。

1.2.2 Excel文件写入

go-xlsx允许您创建、修改和写入Excel文件。您可以设置单元格的值、应用格式和样式,并保存修改后的文件。

以下是使用go-xlsx创建和写入Excel文件的示例代码:

package mainimport ("fmt""github.com/360EntSecGroup-Skylar/excelize"
)func main() {// 创建一个新的Excel文件f := excelize.NewFile()// 设置单元格的值f.SetCellValue("Sheet1", "A1", "Hello")f.SetCellValue("Sheet1", "B1", "World")// 保存文件err := f.SaveAs("output.xlsx")if err != nil {fmt.Println(err)return}fmt.Println("Excel文件创建成功。")
}

在上面的示例中,我们使用excelize.NewFile()创建一个新的Excel文件。然后我们在第一个工作表中设置单元格的值,并最终使用f.SaveAs("output.xlsx")保存文件。生成的文件将保存为"output.xlsx"。

1.2.3 Excel文件内容操作与管理

go-xlsx提供了各种函数来操作和管理Excel文件的内容。这包括插入或删除行和列、合并单元格、应用格式和样式等操作。

以下是使用go-xlsx插入一行的示例代码:

package mainimport ("fmt""github.com/360EntSecGroup-Skylar/excelize"
)func main() {// 打开Excel文件f, err := excelize.OpenFile("input.xlsx")if err != nil {fmt.Println(err)return}// 在第3行插入一行f.InsertRow("Sheet1", 3)// 设置插入行的单元格值f.SetCellValue("Sheet1", "A3", "新值")f.SetCellValue("Sheet1", "B3", 123)// 保存修改后的文件err = f.SaveAs("output.xlsx")if err != nil {fmt.Println(err)return}fmt.Println("插入行成功。")
}

在上面的示例中,我们使用excelize.OpenFile()打开名为"input.xlsx"的现有Excel文件。然后我们使用f.InsertRow()在第3行插入一行,并设置插入行的单元格值。最后,我们将修改后的文件保存为"output.xlsx"。

这就是关于go-xlsx及其核心功能的介绍。在下一章中,我们将探索另一个Go库:go-leveldb - 一个键值对数据库库。

第二章:go-leveldb - 键值对数据库库

2.1 go-leveldb简介

go-leveldb是一个Go语言的键值对数据库库,它基于LevelDB。LevelDB是Google开发的一种高性能的键值对存储引擎,它具有快速的读写速度和高效的存储方式。

2.1.1 LevelDB背景信息

LevelDB是一个开源的持久化键值对存储引擎,它可以在内存和磁盘之间进行数据存储。它采用了类似于LSM树(Log-structured Merge Tree)的存储结构,具有高效的读写性能和支持快速随机访问的特性。

2.1.2 go-leveldb库的功能特点

go-leveldb库提供了许多便捷的功能,使得使用LevelDB变得简单和高效。

  • 支持持久化存储:数据可以持久化地存储在磁盘上,因此即使程序重新启动,数据也不会丢失。
  • 高性能的读写操作:由于LevelDB的特性,go-leveldb提供了高效的读写操作,适用于高并发的场景。
  • 灵活的键值对操作:可以通过键来获取对应的值,并可以进行插入、删除和更新等操作。
  • 数据压缩和快照支持:go-leveldb支持数据的压缩和快照功能,可以节省存储空间并方便数据的备份和恢复。

2.2 go-leveldb操作实践

接下来,我们将展示go-leveldb的操作实践,包括数据插入与更新、数据查询与删除以及库的性能优化和注意事项。

2.2.1 数据插入与更新

下面是一个示例代码,演示如何使用go-leveldb进行数据插入和更新操作:

package mainimport ("fmt""github.com/syndtr/goleveldb/leveldb"
)func main() {// 打开或创建数据库db, err := leveldb.OpenFile("mydb", nil)if err != nil {fmt.Println(err)return}defer db.Close()// 插入数据err = db.Put([]byte("key1"), []byte("value1"), nil)if err != nil {fmt.Println(err)return}// 更新数据err = db.Put([]byte("key1"), []byte("new value"), nil)if err != nil {fmt.Println(err)return}fmt.Println("数据插入和更新成功。")
}

在上面的示例中,我们使用leveldb.OpenFile()打开或创建一个名为"mydb"的数据库实例。然后,我们使用db.Put()插入了一个键值对(“key1"和"value1”)。接着,我们使用相同的键进行了一次更新操作,将值从"value1"更改为"new value"。

2.2.2 数据查询与删除

下面的示例演示了如何使用go-leveldb进行数据查询和删除操作:

package mainimport ("fmt""github.com/syndtr/goleveldb/leveldb"
)func main() {// 打开数据库db, err := leveldb.OpenFile("mydb", nil)if err != nil {fmt.Println(err)return}defer db.Close()// 查询数据value, err := db.Get([]byte("key1"), nil)if err != nil {fmt.Println(err)return}fmt.Println("查询到的值:", string(value))// 删除数据err = db.Delete([]byte("key1"), nil)if err != nil {fmt.Println(err)return}fmt.Println("数据查询和删除成功。")
}

在上面的示例中,我们使用leveldb.OpenFile()打开了"mydb"数据库。然后,我们使用db.Get()查询"key1"键对应的值,并打印出查询结果。然后,我们使用db.Delete()删除了"key1"键对应的数据。

2.2.3 库的性能优化与注意事项

在使用go-leveldb时,我们需要注意一些性能优化和注意事项:

  • 批量操作:如果要插入、更新或删除大量数据,建议使用批量操作,可以提高性能。
  • 编码方式:选择适合的编码方式,可以降低存储空间和提高读写性能。
  • 数据压缩:可以使用数据压缩功能来节省存储空间。
  • 迭代器:使用迭代器可以遍历数据库中的键值对,但请注意避免在迭代过程中进行写操作。

这些是使用go-leveldb时的一些性能优化和注意事项。

这就是关于go-leveldb的介绍和操作实践。在下一章中,我们将探索另一个Go库:go-bolt - 嵌入式键值对数据库库。

第三章:go-bolt - 嵌入式键值对数据库库

3.1 go-bolt简介

go-bolt是一个Go语言的嵌入式键值对数据库库,它基于BoltDB。BoltDB是一个高性能的、纯Go语言的键值对数据库,它可以嵌入到应用程序中,无需额外的数据库服务器。

3.1.1 Bolt数据库基础

BoltDB是由Benjamin B. Engelhardt创建的一种嵌入式、可嵌入事务型的键值对存储。它使用B+树作为存储引擎,具有快速的读写性能和支持事务的特性。

3.1.2 go-bolt的主要优势

go-bolt库继承了BoltDB的优点,并提供了更方便的API和更高级别的抽象,使得使用嵌入式键值对数据库更加简单和易于使用。

  • 高性能:BoltDB的高性能读写操作使得go-bolt非常适合高并发和大规模数据处理。
  • 嵌入式部署:go-bolt可以嵌入到应用程序中,无需单独的数据库服务器,简化了系统架构和部署。
  • 事务支持:go-bolt支持事务操作,保证数据的一致性和完整性,可以回滚或提交一系列操作。
  • 简单易用的API:go-bolt提供了易于使用的API和高级别的抽象,使得开发人员可以快速上手并快速构建键值对存储应用程序。

3.2 go-bolt功能与操作

接下来,我们将进一步探索go-bolt的功能和操作方法。

3.2.1 创建与打开数据库

下面是一个示例代码,演示如何使用go-bolt创建和打开数据库:

package mainimport ("fmt""github.com/boltdb/bolt"
)func main() {// 创建或打开数据库db, err := bolt.Open("mydb.db", 0600, nil)if err != nil {fmt.Println(err)return}defer db.Close()fmt.Println("数据库打开或创建成功。")
}

在上面的示例中,我们使用bolt.Open()函数创建或打开一个名为"mydb.db"的数据库。然后,我们使用defer db.Close()来确保在程序结束时关闭数据库连接。

3.2.2 键值对的基本CRUD操作

下面是一个示例代码,演示如何使用go-bolt进行基本的键值对操作:

package mainimport ("fmt""github.com/boltdb/bolt"
)func main() {db, err := bolt.Open("mydb.db", 0600, nil)if err != nil {fmt.Println(err)return}defer db.Close()// 写入数据err = db.Update(func(tx *bolt.Tx) error {bucket, err := tx.CreateBucket([]byte("mybucket"))if err != nil {return fmt.Errorf("创建Bucket失败:%s", err)}err = bucket.Put([]byte("key1"), []byte("value1"))if err != nil {return fmt.Errorf("写入数据失败:%s", err)}return nil})if err != nil {fmt.Println(err)return}// 读取数据err = db.View(func(tx *bolt.Tx) error {bucket := tx.Bucket([]byte("mybucket"))if bucket == nil {return fmt.Errorf("Bucket不存在")}value := bucket.Get([]byte("key1"))fmt.Println("查询到的值:", string(value))return nil})if err != nil {fmt.Println(err)return}fmt.Println("数据读写成功。")
}

在上面的示例中,我们使用db.Update()函数进行写操作,创建一个名为"mybucket"的Bucket,并向其中写入一个键值对(“key1"和"value1”)。然后,我们使用db.View()函数进行读操作,获取"mybucket"中"key1"键对应的值,并打印查询结果。

3.2.3 数据库事务与并发控制

go-bolt支持数据库事务和并发控制,可以确保数据的一致性和完整性。

以下是一个示例代码,演示了如何使用go-bolt进行并发访问控制:

package mainimport ("fmt""github.com/boltdb/bolt""sync"
)var wg sync.WaitGroupfunc main() {db, err := bolt.Open("mydb.db", 0600, nil)if err != nil {fmt.Println(err)return}defer db.Close()wg.Add(2)// 启动两个并发访问协程go updateData(db)go readData(db)wg.Wait()fmt.Println("并发操作完成。")
}func updateData(db *bolt.DB) {defer wg.Done()err := db.Update(func(tx *bolt.Tx) error {bucket, err := tx.CreateBucket([]byte("mybucket"))if err != nil {return fmt.Errorf("创建Bucket失败:%s", err)}err = bucket.Put([]byte("key1"), []byte("new value"))if err != nil {return fmt.Errorf("写入数据失败:%s", err)}return nil})if err != nil {fmt.Println(err)return}fmt.Println("数据更新成功。")
}func readData(db *bolt.DB) {defer wg.Done()err := db.View(func(tx *bolt.Tx) error {bucket := tx.Bucket([]byte("mybucket"))if bucket == nil {return fmt.Errorf("Bucket不存在")}value := bucket.Get([]byte("key1"))fmt.Println("查询到的值:", string(value))return nil})if err != nil {fmt.Println(err)return}fmt.Println("数据查询成功。")
}

在上面的示例中,我们使用db.Update()进行写操作,和db.View()进行读操作。在主函数中,我们启动了两个并发的协程,一个执行数据更新操作,另一个执行数据查询操作,并使用sync.WaitGroup等待协程的完成。

这就是关于go-bolt的介绍和操作。在第四章中,我们将探索另一个Go库:go-orientdb - 一个OrientDB图数据库库。

第四章:go-orientdb - OrientDB图数据库库

4.1 go-orientdb概述

go-orientdb是一个Go语言的OrientDB图数据库库。OrientDB是一个面向对象的、高性能的多模型开源数据库,它支持图数据库、文档数据库和键值对数据库等多种数据模型。

4.1.1 OrientDB数据库特性

OrientDB具有以下主要特性:

  • 强大的图数据库能力:OrientDB以其强大的图形处理能力而闻名,支持复杂的图形查询和遍历操作。
  • SQL和NoSQL支持:OrientDB既支持传统的SQL查询语言,也支持类似于文档数据库的NoSQL查询。
  • 高性能和可扩展性:OrientDB是一个高性能的数据库,能够处理大规模的数据集并提供横向扩展的能力。
  • 嵌入式和分布式部署:OrientDB可以作为一个嵌入式数据库嵌入到应用程序中,也可以作为一个分布式数据库部署在多台服务器上。
4.1.2 go-orientdb库的主要功能

go-orientdb库提供了与OrientDB数据库交互的功能,包括连接到数据库、创建模型、执行查询和遍历等。

  • 连接和认证:go-orientdb提供了连接到OrientDB数据库并进行身份验证的功能。
  • 数据模型构建:go-orientdb允许您定义顶点(Vertex)和边(Edge)的模型,以构建图数据库。
  • 查询和遍历:go-orientdb提供了灵活而强大的查询语言和遍历功能,以检索和操作图数据库的数据。

4.2 go-orientdb在OrientDB上的应用

在本节中,我们将探索go-orientdb在OrientDB上的应用,并演示一些常见的操作。

4.2.1 图数据库的创建与连接

下面是一个示例代码,演示如何使用go-orientdb创建和连接到OrientDB图数据库:

package mainimport ("fmt""github.com/mustafaakin/go-orientdb"
)func main() {// 创建一个新的数据库连接client, err := orientdb.NewClient(orientdb.ConnectionConfig{Addr:       "localhost",Port:       2424,Database:   "mydb",Username:   "admin",Password:   "admin",Serializer: orientdb.JSON,},)if err != nil {fmt.Println(err)return}defer client.Close()fmt.Println("成功连接到OrientDB数据库。")
}

在上面的示例中,我们使用orientdb.NewClient()函数创建一个新的数据库连接。我们提供了连接的地址、端口、数据库名称、用户名和密码。最后,我们使用defer client.Close()确保在程序结束时关闭数据库连接。

4.2.2 数据模型构建与查询操作

下面是一个示例代码,演示如何使用go-orientdb进行数据模型构建和查询操作:

package mainimport ("fmt""github.com/mustafaakin/go-orientdb""github.com/mustafaakin/go-orientdb/oop"
)type Person struct {Name string `orientdb:"name"`Age  int    `orientdb:"age"`
}func main() {client, err := orientdb.NewClient(orientdb.ConnectionConfig{Addr:       "localhost",Port:       2424,Database:   "mydb",Username:   "admin",Password:   "admin",Serializer: orientdb.JSON,},)if err != nil {fmt.Println(err)return}defer client.Close()// 创建Person类的模型_, err = client.CreateClass(oop.Class{Name: "Person",Properties: []oop.Property{{Name: "name", Type: "STRING"},{Name: "age", Type: "INTEGER"},},})if err != nil {fmt.Println(err)return}// 创建一个Person实例并保存到数据库person := Person{Name: "John", Age: 30}_, err = client.InsertDocument("Person", person)if err != nil {fmt.Println(err)return}// 查询Person实例query := "SELECT FROM Person"resultSet, err := client.Query(query)if err != nil {fmt.Println(err)return}// 处理查询结果for resultSet.Next() {var p Personif err := resultSet.Document(&p); err != nil {fmt.Println(err)return}fmt.Println("查询结果:", p)}fmt.Println("数据模型构建和查询成功。")
}

在上面的示例中,我们定义了一个名为Person的结构体,并使用orientdb:""标签指定了字段与数据库中属性的映射关系。然后,我们使用client.CreateClass()创建了一个名为"Person"的类和相应的属性。接着,我们创建了一个Person实例并将其保存到数据库中。最后,我们使用client.Query()执行了一个查询,并遍历查询结果。

4.2.3 高级功能探索:图遍历与数据分析

go-orientdb还提供了用于图遍历和数据分析的功能。以下是一个示例代码,演示了如何使用go-orientdb进行图遍历和数据分析:

package mainimport ("fmt""github.com/mustafaakin/go-orientdb"
)func main() {client, err := orientdb.NewClient(orientdb.ConnectionConfig{Addr:       "localhost",Port:       2424,Database:   "mydb",Username:   "admin",Password:   "admin",Serializer: orientdb.JSON,},)if err != nil {fmt.Println(err)return}defer client.Close()// 执行图遍历操作query := "TRAVERSE OUT('HasFriend') FROM #12:0"resultSet, err := client.Traverse(query)if err != nil {fmt.Println(err)return}// 处理遍历结果for resultSet.Next() {value, err := resultSet.Value()if err != nil {fmt.Println(err)return}fmt.Println("遍历结果:", value)}// 执行数据分析操作query = "SELECT name, COUNT(*) as count FROM Person GROUP BY name"resultSet, err = client.Query(query)if err != nil {fmt.Println(err)return}// 处理查询结果for resultSet.Next() {var name stringvar count intif err := resultSet.Scan(&name, &count); err != nil {fmt.Println(err)return}fmt.Println("数据分析结果:", name, count)}fmt.Println("图遍历和数据分析成功。")
}

在上面的示例中,我们使用client.Traverse()执行了一个图遍历操作,遍历了从顶点#12:0出发的所有边的路径。然后,我们遍历了遍历结果并打印每个节点的值。

然后,我们使用client.Query()执行了一个数据分析操作,使用聚合函数COUNT统计了Person类中每个name值的数量。最后,我们遍历了查询结果并打印每个name值和对应的数量。

这就是关于go-orientdb的概述和应用实例。在第五章中,我们将继续探索另一个Go库:go-sqlite3 - 用于SQLite数据库的绑定库。

第五章:go-sqlite3 - 用于SQLite数据库的绑定库

5.1 go-sqlite3简介

go-sqlite3是一个Go语言的SQLite数据库绑定库。SQLite是一个轻量级、嵌入式的数据库引擎,它提供了一种自包含的、零配置的、支持事务的SQL解决方案。

5.1.1 SQLite数据库简介

SQLite是一个C库,实现了一种自包含、无服务器、零配置、事务性的SQL数据库引擎。它是一种嵌入式数据库,意味着它在应用程序内部运行,不需要单独的数据库服务器进程。

5.1.2 go-sqlite3库的功能概览

go-sqlite3库提供了一系列功能,使得在Go语言中使用SQLite数据库变得简单和高效。

  • 连接和打开数据库:go-sqlite3提供了打开和连接到SQLite数据库的功能。
  • SQL查询和事务操作:go-sqlite3支持使用SQL语句进行查询操作,并提供了事务支持,可以保证数据的一致性和完整性。
  • 预编译语句:go-sqlite3支持预编译和重用SQL语句,提高执行效率。
  • 数据库迁移:go-sqlite3提供了数据库迁移功能,可以更方便地管理数据库模式的变更。

5.2 go-sqlite3操作与实践

接下来,我们将进一步探索go-sqlite3的操作和实践方法。

5.2.1 连接与初始化SQLite数据库

下面是一个示例代码,演示如何使用go-sqlite3连接和初始化SQLite数据库:

package mainimport ("database/sql""fmt"_ "github.com/mattn/go-sqlite3"
)func main() {// 连接和打开数据库db, err := sql.Open("sqlite3", "./mydb.db")if err != nil {fmt.Println(err)return}defer db.Close()// 创建表格createTableStmt := `CREATE TABLE IF NOT EXISTS Person (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER NOT NULL);`_, err = db.Exec(createTableStmt)if err != nil {fmt.Println(err)return}fmt.Println("SQLite数据库连接成功并表格创建成功。")
}

在上面的示例中,我们使用sql.Open()函数连接到SQLite数据库。我们指定了SQLite驱动程序名称和数据库文件的路径。然后,我们使用defer db.Close()确保在程序停止时关闭数据库连接。

接着,我们使用CREATE TABLE语句创建了一个名为Person的表格,该表格包含id、name和age三个列。最后,我们使用db.Exec()函数执行SQL语句来创建表格。

5.2.2 使用SQL语句进行CRUD操作

下面是一个示例代码,演示了如何使用go-sqlite3执行SQL语句进行CRUD操作:

package mainimport ("database/sql""fmt"_ "github.com/mattn/go-sqlite3"
)type Person struct {ID   intName stringAge  int
}func main() {db, err := sql.Open("sqlite3", "./mydb.db")if err != nil {fmt.Println(err)return}defer db.Close()// 插入数据insertStmt := "INSERT INTO Person (name, age) VALUES (?, ?)"result, err := db.Exec(insertStmt, "John", 30)if err != nil {fmt.Println(err)return}lastInsertID, _ := result.LastInsertId()fmt.Println("插入数据成功,最后插入ID为:", lastInsertID)// 查询数据selectStmt := "SELECT * FROM Person"rows, err := db.Query(selectStmt)if err != nil {fmt.Println(err)return}defer rows.Close()// 处理查询结果var people []Personfor rows.Next() {var person Personerr := rows.Scan(&person.ID, &person.Name, &person.Age)if err != nil {fmt.Println(err)return}people = append(people, person)}fmt.Println("查询到的数据:")for _, p := range people {fmt.Printf("ID: %d, Name: %s, Age: %d\n", p.ID, p.Name, p.Age)}fmt.Println("CRUD操作成功。")
}

在上面的示例中,我们使用db.Exec()函数执行插入数据的SQL语句。我们使用问号占位符来传递参数,并通过result.LastInsertId()获取最后插入的ID。

然后,我们使用db.Query()函数执行查询数据的SQL语句。我们使用rows.Scan()函数将查询结果的每一行扫描到我们定义的Person结构体中。最后,我们遍历查询结果,并打印出每个人的ID、姓名和年龄。

5.2.3 支持高级特性:事务、预编译语句、数据库迁移

go-sqlite3还支持一些高级特性,如事务、预编译语句和数据库迁移。以下是一个示例代码,演示了这些高级特性的使用:

package mainimport ("database/sql""fmt"_ "github.com/mattn/go-sqlite3"
)type Person struct {ID   intName stringAge  int
}func main() {db, err := sql.Open("sqlite3", "./mydb.db")if err != nil {fmt.Println(err)return}defer db.Close()// 开始事务tx, err := db.Begin()if err != nil {fmt.Println(err)return}// 执行多个操作insertStmt := "INSERT INTO Person (name, age) VALUES (?, ?)"_, err = tx.Exec(insertStmt, "John", 30)if err != nil {tx.Rollback()fmt.Println(err)return}_, err = tx.Exec(insertStmt, "Alice", 25)if err != nil {tx.Rollback()fmt.Println(err)return}// 提交事务err = tx.Commit()if err != nil {fmt.Println(err)return}// 预编译语句stmt, err := db.Prepare("SELECT * FROM Person WHERE age > ?")if err != nil {fmt.Println(err)return}defer stmt.Close()// 执行预编译语句rows, err := stmt.Query(20)if err != nil {fmt.Println(err)return}defer rows.Close()// 处理查询结果var people []Personfor rows.Next() {var person Personerr := rows.Scan(&person.ID, &person.Name, &person.Age)if err != nil {fmt.Println(err)return}people = append(people, person)}fmt.Println("查询到的数据:")for _, p := range people {fmt.Printf("ID: %d, Name: %s, Age: %d\n", p.ID, p.Name, p.Age)}fmt.Println("事务、预编译语句和数据库迁移成功。")
}

在上面的示例中,我们使用db.Begin()函数开始一个事务,并使用tx.Exec()函数执行多个操作。如果任何一个操作失败,我们使用tx.Rollback()进行回滚。最后,我们使用tx.Commit()提交事务。

然后,我们使用db.Prepare()函数预编译查询语句,并通过stmt.Query()函数执行预编译语句。最后,我们处理查询结果并打印出每个人的信息。

这就是关于go-sqlite3的介绍和操作实践。在第六章中,我们将继续探索另一个Go库:grpc-go - 用于实现gRPC的库。

第六章 grpc-go:gRPC库

6.1 grpc-go简介

gRPC是一个高性能、开源的远程过程调用(RPC)框架,由Google开发。grpc-go是gRPC的Go语言实现版本。通过使用gRPC,开发者可以定义服务接口和消息结构,并轻松地在客户端和服务端之间进行跨语言的通信。

6.1.1 gRPC协议及原理

gRPC基于HTTP/2协议和Protocol Buffers进行通信。HTTP/2协议提供了高效的双向流传输和多路复用,而Protocol Buffers是一种高效的二进制序列化格式,提供了简洁的接口定义和跨语言支持。

gRPC使用IDL(Interface Definition Language)定义服务接口和消息结构,可以自动生成相应的客户端和服务端代码。它支持多种编程语言,并提供丰富的特性,如双向流、流式数据传输和身份认证等。

6.1.2 grpc-go库的功能与地位

grpc-go是gRPC在Go语言中的实现库。它提供了一系列功能和工具,使得在Go语言中使用gRPC变得简单和高效。grpc-go具有以下特点和优势:

  • 高性能:grpc-go使用HTTP/2协议和Protocol Buffers实现了高效的通信和序列化,具有出色的性能。
  • 轻量级:grpc-go是一个轻量级的库,可以快速构建和部署跨语言的客户端和服务端。
  • 自动代码生成:通过使用gRPC的IDL,grpc-go可以自动生成所需的代码,简化了开发过程。
  • 丰富的特性:grpc-go支持双向流、流式数据传输、负载均衡、错误处理和身份认证等高级特性。

6.2 grpc-go的使用与开发

在本节中,我们将深入探讨grpc-go的使用和开发方法。

6.2.1 定义服务接口与消息结构

使用gRPC开发一个应用程序的第一步是定义服务接口和消息结构。服务接口定义了所有的RPC方法,而消息结构定义了在这些方法之间传输的数据。

// 定义服务接口
service HelloService {rpc SayHello (HelloRequest) returns (HelloResponse) {}
}// 定义消息结构
message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}

以上是一个简单的示例,定义了一个名为HelloService的服务接口,它包含一个SayHello方法。SayHello方法接收一个名为HelloRequest的消息,并返回一个名为HelloResponse的消息。

6.2.2 实现服务端与客户端

在使用grpc-go开发应用程序时,需要实现服务端和客户端代码。

以下是一个简单的示例,演示了如何使用grpc-go实现服务端和客户端:

// 服务端
func main() {// 创建监听lis, err := net.Listen("tcp", "localhost:50051")if err != nil {log.Fatalf("监听失败:%v", err)}// 创建gRPC服务器s := grpc.NewServer()// 注册服务pb.RegisterHelloServiceServer(s, &server{})// 启动服务if err := s.Serve(lis); err != nil {log.Fatalf("启动服务失败:%v", err)}
}// 客户端
func main() {// 建立连接conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())if err != nil {log.Fatalf("连接失败:%v", err)}defer conn.Close()// 创建客户端client := pb.NewHelloServiceClient(conn)// 调用远程方法resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "Alice"})if err != nil {log.Fatalf("远程调用失败:%v", err)}// 处理响应log.Printf("收到响应:%s", resp.Message)
}

在上面的示例中,我们首先在服务端使用net.Listen()创建一个监听,然后使用grpc.NewServer()创建一个gRPC服务器。接着,我们在服务端实现了SayHello方法的逻辑,并使用pb.RegisterHelloServiceServer()注册服务。最后,我们使用s.Serve(lis)启动服务。

在客户端中,我们使用grpc.Dial()建立与服务端的连接,然后使用pb.NewHelloServiceClient()创建一个客户端实例。我们调用客户端的SayHello方法,并处理响应结果。

6.2.3 负载均衡、身份认证和错误处理机制

grpc-go还提供了一些高级特性,如负载均衡、身份认证和错误处理机制等。

负载均衡可以帮助将请求分配到多个服务实例上,提高整体系统的吞吐量和可用性。

身份认证可以用于验证客户端和服务端之间的身份,保护通信过程的安全性。

错误处理机制可以提供更好的错误信息和调试能力,帮助开发者定位和解决问题。

这些高级特性需要在定义服务接口和实现代码时进行配置和处理。

这就是关于grpc-go的介绍和使用。通过使用grpc-go,开发者可以轻松构建高性能、可扩展的分布式系统,并实现跨语言的通信和交互。

总结:

本文详细介绍了几个Go语言库,包括go-xlsx、go-leveldb、go-bolt、go-orientdb和grpc-go。这些库提供了一系列功能,例如处理Excel文件、键值对数据库、嵌入式数据库、图数据库和实现RPC等。通过学习这些库的特性和使用方法,开发者可以更高效地处理各种任务。这些库的简洁和易用性使它们成为Go语言开发中不可或缺的工具之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027613.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Windows 11 上安装 MongoDB

MongoDB 是一个流行的 NoSQL 数据库,它提供了灵活的数据存储方案,而 MongoDB Compass 则是一个可视化管理工具,可以更轻松地与 MongoDB 数据库交互和管理。在本文中,我们将介绍如何在 Windows 11 上安装 MongoDB,并配置…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件,专为Mac用户设计,旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能,可以精确显示每个网络连接的状态,让用户轻松掌握网络活动情况。 软件下载:Radio…

B2902A是德科技B2902A精密型电源

181/2461/8938产品概述: Agilent B2902A 精密源/测量单元 (SMU) 是一款 2 通道、紧凑且经济高效的台式 SMU,能够源和测量电压和电流。它用途广泛,可以轻松、高精度地执行 I/V(电流与电压)测量。4 象限源和测量功能的集…

基于SpringCloud+Hadoop+Vue实现的企业级网盘系统实现

编程语言:Java、Mybatis、Spring、SpringBoot、SpringCloud、Node、Vue 开发环境:Windows 10 Mysql 开发工具:WebStorm、IDEA编译器、Git、Maven 应用部署服务器:SpringBoot内置Tomcat插件 Node服务器:Node v10.1…

低功耗、低成本 NAS/公共文件夹 的可能性

使用现状:多台工作电脑,家里人手一台,还在两个住处 有好几台工作电脑,不同电脑不同OS有不同的用途,最大的问题就是各个电脑上文件的同步问题,这里当然就需要局域网里的公共文件夹,在NAS的问题上…

002-基于Pytorch的手写汉字数字分类

本节将介绍一种 2.1 准备 2.1.1 数据集 (1)MNIST 只要学习过深度学习相关理论的人,都一定听说过名字叫做LeNet-5模型,它是深度学习三巨头只有Yann Lecun在1998年提出的一个CNN模型(很多人认为这是第一个具有实际应用…

Qlib-Server:量化库数据服务器

Qlib-Server:量化库数据服务器 介绍 Qlib-Server 是 Qlib 的配套服务器系统,它利用 Qlib 进行基本计算,并提供广泛的服务器系统和缓存机制。通过 Qlib-Server,可以以集中的方式管理 Qlib 提供的数据。 框架 Qlib 的客户端/服务器框架基于 WebSocket 构建,这是因为 WebS…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致),不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致,…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理(提问)技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接: Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测:NL…

【并发】第二篇 ThreadLocal详解

导航 一. ThreadLocal 简介二. ThreadLocal 源码解析1. get2. set3 .remove4. initialValue三. ThreadLocalMap 源码分析1. 构造方法2. getEntry()3. set()4. resize()5. expungeStaleEntries()6. cleanSomeSlots()7. nextIndex()8. remove()9. 总结ThreadLocalMap四. 内存泄漏…

HarmonyOS 应用开发之显式Want与隐式Want匹配规则

在启动目标应用组件时,会通过显式 Want 或者隐式 Want 进行目标应用组件的匹配,这里说的匹配规则就是调用方传入的 want 参数中设置的参数如何与目标应用组件声明的配置文件进行匹配。 显式Want匹配原理 显式 Want 匹配原理如下表所示。 名称类型匹配…

NanoMQ的安装与部署

本文使用docker进行安装,因此安装之前需要已经安装了docker 拉取镜像 docker pull emqx/nanomq:latest 相关配置及密码认证 创建目录/usr/local/nanomq/conf以及配置文件nanomq.conf、pwd.conf # # # # MQTT Broker # # mqtt {property_size 32max_packet_siz…

使用苹果应用商店上架工具实现应用快速审核与发布

摘要 移动应用app上架是开发者关注的重要环节,但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作,各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用,最终指出合理使用工具的重要性。 引言 移动应…

第4章.精通标准提示,引领ChatGPT精准输出

标准提示 标准提示,是引导ChatGPT输出的一个简单方法,它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词:汇总这篇新闻 : …… 提示公式:生成[任务] 生成新闻文章的摘要: 任务&#x…

Stable Diffusion WebUI 生成参数:脚本(Script)——提示词矩阵、从文本框或文件载入提示词、X/Y/Z图表

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 在本篇文章中,我们将深入探讨 Stable Diffusion WebUI 的另一个引人注目的生成参数——脚本(Script)。我们将逐一细说提示词矩阵、从文本框或文件导入提示词,…

跑腿小程序|基于微信小程序的跑腿平台小程序设计与实现(源码+数据库+文档)

跑腿平台小程序目录 目录 基于微信小程序的跑腿平台小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、跑腿任务管理 3、任务类型管理 4、公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

如何安全地添加液氮到液氮罐中

液氮是一种极低温的液体,它在许多领域广泛应用,但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作,需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…

SnapGene 5 for Mac 分子生物学软件

SnapGene 5 for Mac是一款专为Mac操作系统设计的分子生物学软件,以其强大的功能和用户友好的界面,为科研人员提供了高效、便捷的基因克隆和分子实验设计体验。 软件下载:SnapGene 5 for Mac v5.3.1中文激活版 这款软件支持DNA构建和克隆设计&…

线性代数 - 应该学啥 以及哪些可以交给计算机

AI很热,所以小伙伴们不免要温故知新旧时噩梦 - 线代。 (十几年前,还有一个逼着大家梦回课堂的风口,图形学。) 这个真的不是什么美好的回忆,且不说老师的口音,也不说教材的云山雾绕,单…

JVM(一)——内存结构

一. 前言 1、什么是 JVM? 1)定义: Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境) 2)好处: 一次编写,到处运行自动内存管理,垃圾回收功能数组下标越…