返回顶部
首页 > 资讯 > 精选 >如何编写Go语言库
  • 840
分享到

如何编写Go语言库

2023-06-16 15:06:32 840人浏览 泡泡鱼
摘要

这篇文章主要讲解了“如何编写Go语言库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写Go语言库”吧!不要对 HTTP 客户端硬编码很对库都包含了对 Http.DefaultClien

这篇文章主要讲解了“如何编写Go语言库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写Go语言库”吧!

如何编写Go语言库

不要对 HTTP 客户端硬编码

很对库都包含了对 Http.DefaultClient 的硬编码。虽然对库本身来说这并不是问题,但是库的作者并未理解应该怎样使用  http.DefaultClient 。正如 default client 建议它只在用户没有提供其他 http.Client  时才被使用。相反的是,许多库作者乐意在他们代码中涉及 http.DefaultClient  的部分采用硬编码,而不是将它作为一个备选。这会导致在某些情况下这个库不可用。

首先,我们很多人都读过这篇讲述 http.DefaultClient 不能自定义超时时间的文章《Don’t use Go’s default HTTP  client (in production)[1]》,当你没法保证你的HTTP  请求一定会完成(或者至少要等一个完全无法预估时间的响应)时,你的程序可能会遇到奇怪的 goroutine 泄漏和一些无法预知的行为。在我看来,这会使每一个对  http.DefaultClient 采用硬编码的库不可用。

其次,网络需要一些额外的配置。有时候需要用到代理,有时候需要对 URL 进行一丢丢的改写,甚至可能 http.Transport  需要被一个定制的接口替换。当一个程序员在你的库里用他们自己的 http.Client 实例时,以上这些都很容易被实现。

在你的库中处理 http.Client 的推荐方式是使用提供的客户端,但是如果需要的话,有一个默认的备选:

func CreateLibrary(client *http.Client) *Library {    if client == nil {        client = http.DefaultClient    }    ...}

或者如果你想从工厂函数中移除参数,请在你的 struct 中定义一个辅助方法,并且让用户在需要时设置其属性:

type Library struct {    Client *http.Client}func (l *Library) getClient() *http.Client {    if l.Client == nil {        return http.DefaultClient    }    return l.Client}

另外,如果一些全局的特性对于每个请求来讲都是必须的,人们经常感觉到需要用他们自己的实例来替换 http.Client。这是一个错误的方法 —  如果你需要在你的请求中设置一些额外的  headers,或者在你的客户端引入某类公共的特性,你只需要简单为每个请求进行设置或者用组装定制客户端的方式来代替完全替换它。

不要引入全局变量

另一个反面模式是允许用户在一个库中设置全局变量。举个例子,在你的库中允许用户设置一个全局的 http.Client 并被所有的 HTTP  调用执行:

var libraryClient *http.Client = http.DefaultClientfunc SetHttpClient(client *http.Client) {    libraryClient = client}

通常在一个库中不应该存在一堆全局变量。当你写代码的时候,你应该想想用户在他们的程序中多次使用你的这个库会发生什么。全局变量会使不同的参数没有办法被使用。而且,在你的代码中引入全局变量会引起测试上的问题并造成代码上不必要的复杂度。使用全局变量可能会导致在你程序的不同模块有不必要的依赖。在写你的库的时候,避免全局状态是格外重要的。

返回 structs,而不是 interfaces

这是一个普遍的问题(实际上我在这一点上也犯过错)。很多库都有下面这类函数:

func New() LibraryInterface {    ...}

在上面的 case 中,返回一个 interface 使 struct 的特性在库里被隐藏了。实际上应该这么写:

func New() *LibraryStruct {    ...}

在库里不应该存在接口的声明,除非它被用在某个函数参数中。如果出现上面的 case,你就应该想想你在写这个库的时候的约定。当返回一个 interface  时,你基本上得声明一系列可用的方法。如果有人想用这个接口来实现他们自己的功能(比如说为了测试),他得打乱他们的代码来添加更多的方法。这意味着尽管在 struct  里添加方法是安全的,但在 interface 里不是。你想修改库中的一些特性,你可以简单的修改 struct 中一些公开的字段。但是如果你的库只提供给用户一个  interface,这就玩不转了。

使用配置结构体来避免修改你的APIs

另一种配置方法是在你的工厂函数中接收一个配置结构体,而不是直接传配置参数。你可以很随意的添加新的参数而不用破坏现有的  api。你只需要做一件事情,在Config结构体中添加一个新的字段,并且确保不会影响它原本的特性。

func New(config Config) *LibraryStruct {    ...}

下面是一种添加结构体字段的正确的场景,如果一个用户初始化结构体的时候忘了添加字段名,这是一种我认为修改他们的代码能得到原谅的场景。为了维护兼容性,你应该在你的代码中用  person{name: "Alice", age: 30} 而不是 person{"Alice", 30}。

你能在 golang.org/x/crypto[4]  包里看到对上面的补充。总之,对配置来说,我认为允许用户在返回的结构体里设置不同的参数是一个更好的方法,并且只在编写复杂方法时才使用这种特定方法。

感谢各位的阅读,以上就是“如何编写Go语言库”的内容了,经过本文的学习后,相信大家对如何编写Go语言库这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何编写Go语言库

本文链接: https://lsjlt.com/news/284170.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何编写Go语言库
    这篇文章主要讲解了“如何编写Go语言库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写Go语言库”吧!不要对 HTTP 客户端硬编码很对库都包含了对 http.DefaultClien...
    99+
    2023-06-16
  • 如何使用Go语言编写实时API?
    Go语言是一种高效、简洁、高并发的编程语言,非常适合用于开发实时API。在本篇文章中,我们将会介绍如何使用Go语言编写实时API,并通过演示代码来展示具体实现方法。 理解实时API 实时API是指在请求发出后,服务端能够立即返回实时结果...
    99+
    2023-09-12
    数组 api 实时
  • Go编程语言如何用来编写Web应用
    这篇文章主要为大家展示了“Go编程语言如何用来编写Web应用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go编程语言如何用来编写Web应用”这篇文章吧。Go语...
    99+
    2024-04-02
  • Go语言中如何编写高效的路由
    随着互联网的普及和发展,越来越多的应用需要提供网络访问接口,而路由器则作为网络通信的核心组件,发挥着至关重要的作用。在这篇文章中,我们将会介绍如何使用Go语言来编写高效的路由,并提供具体的代码示例,帮助读者更好地理解。一、路由器的功能与作用...
    99+
    2023-12-18
    Go语言 路由 高效
  • 如何使用Go语言编写高效的算法?
    Go语言是一种高效、可靠、简单、快速的编程语言,它被广泛应用于各种领域,包括算法开发。在本文中,我们将探讨如何使用Go语言编写高效的算法。 选择合适的数据结构 在编写高效的算法时,选择合适的数据结构非常重要。Go语言提供了多种数据结构...
    99+
    2023-09-11
    编程算法 laravel 响应
  • 如何用GO语言编写高效的异步API?
    随着互联网的不断发展,越来越多的应用场景需要使用到异步API。异步API的优势在于,可以在不阻塞线程的情况下,实现高并发的处理能力。在GO语言中,异步API的编写相对简单,本文将介绍如何使用GO语言编写高效的异步API。 一、使用协程 G...
    99+
    2023-07-25
    api 异步编程 numy
  • 学习 Go 语言:如何在 Linux 上编写代码?
    Go 语言自发布以来,已经成为了一种广泛使用的编程语言。它被设计成一门高效、可靠、简单易用的语言,可应用于各种用途。在本文中,我们将探讨如何在 Linux 操作系统上使用 Go 语言编写代码。 安装 Go 在开始编写 Go 代码之前,...
    99+
    2023-07-28
    关键字 教程 linux
  • 如何在Django中使用Go语言编写HTTP API?
    Django是一个非常流行的Python Web框架,它有着强大的开发工具和丰富的生态系统。但是,有时候我们需要使用其他语言来实现一些特定的功能,例如Go语言的高性能和并发处理能力。在这篇文章中,我们将会介绍如何在Django中使用Go语言...
    99+
    2023-07-23
    django api http
  • Go语言的主要编写语言是什么?
    学习知识要善于思考,思考,再思考!今天编程网小编就给大家带来《Go语言的主要编写语言是什么?》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧...
    99+
    2024-04-04
  • Go语言的编写语言有哪些特点?
    Go语言是一种由Google开发的开源编程语言,于2009年正式发布。它被设计成一种简单、高效、可靠的语言,具有许多独特的特点。在本文中,我们将详细介绍Go语言的编写语言特点,并提供一...
    99+
    2024-04-02
  • Go语言的核心编写语言是什么?
    标题:Go语言的核心编写语言是什么? Go语言是一种由Google开发的编程语言,被称为“云时代的C语言”。它具有高效的并发设计、简洁的语法和强大的性能,因此在云计算、大数据和人工智能...
    99+
    2024-04-02
  • 如何使用Go语言编写分布式NumPy接口?
    随着数据规模和计算复杂度的不断增加,分布式计算成为了数据科学家和工程师们必须面对的问题。而NumPy作为Python最常用的科学计算库,其强大的矩阵和向量计算能力也受到了广泛的关注。在这篇文章中,我们将介绍如何使用Go语言编写分布式NumP...
    99+
    2023-08-27
    分布式 numpy 接口
  • 如何在 Laravel 中使用 Go 语言编写的对象?
    Laravel 是一个流行的 PHP 开发框架,而 Go 语言则是一门快速、高效的编程语言。在本文中,我们将探讨如何在 Laravel 中使用 Go 语言编写的对象。 首先,我们需要安装 Go 语言的运行时环境和 Laravel 框架。安装...
    99+
    2023-08-09
    laravel unix 对象
  • 如何在Django中使用GO语言编写的接口?
    Django 是一个优秀的 Python Web 框架,它提供了丰富的功能和强大的扩展性,使得我们可以方便地构建高性能、高效、安全的 Web 应用程序。然而,随着互联网技术的发展,越来越多的 Web 应用程序需要与其他语言编写的服务进行交互...
    99+
    2023-10-26
    ide django 接口
  • 如何使用Go语言编写实时的Spring应用?
    Go语言是一种非常流行的编程语言,它的出现为开发者提供了一种高效、简洁、可靠的编程方式。而Spring框架作为Java语言中最受欢迎的框架之一,也为Java开发者提供了一种高效的开发方式。那么如何使用Go语言编写实时的Spring应用呢?本...
    99+
    2023-11-10
    bash 实时 spring
  • Go语言的编写语言选择及其特点。
    Go语言的编写语言选择及其特点 Go语言是由Google开发的一种具有静态类型的编程语言,它在设计和实现上注重简单性、效率和可靠性。作为一种适用于大型系统开发的语言,Go语言以其优雅的...
    99+
    2024-04-02
  • TiDB是否采用Go语言编写?
    TiDB是一款开源的分布式关系型数据库,它采用Go语言进行编写。Go语言是一种由Google开发的开源编程语言,具有高效的并发性能和简洁的语法,这使得Go语言成为开发分布式系统的理想选...
    99+
    2024-04-02
  • 如何编译go语言程序
    本篇文章给大家分享的是有关如何编译go语言程序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Go语言是编译型的静态语言(和C语言一样),所以在运行Go语言程序之前,先要将其编译...
    99+
    2023-06-15
  • go语言如何编译代码
    go语言编译代码的步骤如下:1、编写Go代码并保存到一个或多个以.go为扩展名的文件中;2、使用命令行界面进入到你的源代码文件所在的目录,并执行”go build“命令来编译代码;3、编译成功后,切换到可执行文件所在的目录,并执行”./ma...
    99+
    2023-12-12
    go语言 Golang go语言编译
  • GO语言学习笔记:如何编写高效的代码?
    GO语言是一种开源的编程语言,由Google开发。它被广泛应用于Web开发、分布式系统、云计算等领域。GO语言拥有高效、简洁、易于学习等特点,因此备受开发者的喜爱。在本文中,我们将探讨如何编写高效的GO语言代码。 一、使用基本数据类型 G...
    99+
    2023-06-28
    学习笔记 教程 开发技术
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作