跳转到主要内容

【Go语言高级开发】Go 闭包简介 - 教程

在本教程中,我们将研究 Go 中的闭包。我们将介绍它们背后的理论,并研究如何在自己的 Go 应用程序中使用它们。

闭包 - 理论


所以,让我们深入理论。

我们可以在任何支持函数作为一等对象的编程语言中创建和使用闭包。 Go,恰好是这样一种语言,否则这篇文章将毫无意义。

因此,闭包的技术定义是闭包是一种使用具有一流功能的语言实现词法范围名称绑定的技术 - 维基百科。

现在,别担心,当我第一次读到这篇文章时,我有点挠头,不得不考虑一下。

用外行的话来说,闭包是一个函数值,它能够引用与它的主体一起布置的变量。

注意 - 重要的是要注意闭包和匿名函数之间的明显区别,这些区别通常被误认为是闭包。您可以在此处了解有关匿名函数的更多信息:Go Anonymous Functions

一个简单的例子


让我们创建一个非常简单的闭包示例,希望能阐明它是如何工作的。

我们将从创建一个名为 getLimit() 的非常简单的函数开始,这将是本例中的闭包。

这将包含一个 int 类型的限制变量,该变量将设置为 10。每次调用 limit()

main.go

【Go语言高级开发】Go 程序基准测试简介

在本文中,我们将看看基准测试。更具体地说,我们将研究如何对基于 Go 的程序进行基准测试。

在性能很重要的时候,能够对程序的执行方式进行基准测试并分析潜在的瓶颈在哪里,真的很有价值。通过了解这些瓶颈所在的位置,我们可以更有效地确定将工作重点放在哪里,以提高我们系统的性能。

注意 - 需要注意的是,性能调整通常应在系统启动并运行后进行。

“过早的优化是万恶之源”——Donald Knuth

在本教程中,我们将研究如何为非常简单的函数执行标准基准测试,然后转向更高级的示例,最后研究如何生成看起来很酷的火焰图。

先决条件

 

  • 您需要在开发机器上安装 Go 版本 1.11+。

一个简单的基准测试


在 Go 中,基准测试可以与标准单元测试一起编写。这些基准函数应以“Benchmark”为前缀,后跟函数名称,与您为测试函数添加前缀 Test 的方式相同。

让我们从我们之前的测试文章中获取我们的代码,并尝试为此编写一个简单的基准函数。创建一个名为 main.go 的新文件并将以下代码添加到该文件中:

【Go语言高级开发】Go WebAssembly 教程 - 构建计算器教程

更新 - 本教程中的代码已更新以适用于 Go v1.12 中的重大更改

欢迎大家! 刚刚发布的 Go v1.11 包含了 WebAssembly 的实验性端口,我想看看我们如何编写自己的 Go 程序直接编译到 WebAssembly 会很棒!

因此,在本文中,我们将构建一个非常简单的计算器,让我们了解如何编写可以暴露给前端的函数、评估 DOM 元素并随后使用来自任何结果的结果更新任何 DOM 元素 我们调用的函数。

希望这将向您展示如何为您的前端应用程序编写和编译您自己的基于 Go 的程序。

注意 - 如果您还没有从开头猜到,则需要 Go v1.11 才能使本教程正常工作!

视频教程


如果您想支持我和我的努力,请查看本教程的视频版本并订阅我的频道!

https://youtu.be/4kBvvk2Bzis

介绍


那么这对 Go 和 Web 开发人员来说究竟意味着什么呢?好吧,它使我们能够使用 Go 语言编写我们的前端 Web 应用程序,以及随后的所有很酷的功能,例如它的类型安全、goroutines 等等。

【Go语言高级开发】Go 泛型入门 - 教程

泛型。

在 Go 语言中添加泛型必须是 Go 社区最具争议的话题之一。

从一开始,我就喜欢 Go 的明确性和为我作为开发人员提供的简单性。我知道,查看函数签名,我将期望在该函数的主体中使用什么类型,并且我通常会知道要注意什么。

添加泛型后,我们的代码库变得更加复杂。我们不再有那种简单明了的东西,我们必须做一些推理和挖掘才能真正知道传递给我们的新函数的是什么。

概述


现在,本文的目的不是争论该语言最新添加的细节,而是尝试为您提供所需的一切,以便在您自己的 Go 应用程序中启动和运行泛型.

入门


在我们开始之前,您需要在本地机器上安装 go1.18beta1。如果你已经安装了 go,你可以通过运行:

$ go install golang.org/dl/go1.18beta1@latest
$ go1.18beta1 download


成功运行这两个命令后,您应该能够在终端中运行 go1.18beta1:

【Go语言高级开发】使用 WebAssembly 和 Go 编写前端 Web 框架

JavaScript 前端框架无疑有助于突破以前在浏览器上下文中可能实现的界限。越来越复杂的应用程序已经出现在 React、Angular 和 VueJS 之类的基础上,仅举几例,而且有一个众所周知的笑话,即新的前端框架似乎每天都在问世。

然而,这种发展速度对于世界各地的开发者来说是一个非常好的消息。对于每一个新框架,我们都发现了更好的处理状态的方法,或者使用影子 DOM 之类的东西有效地渲染。

然而,最新的趋势似乎是朝着用 JavaScript 以外的语言编写这些框架并将它们编译到 WebAssembly 中。多亏了 Lin Clark 之类的人,我们开始看到 JavaScript 和 WebAssembly 通信方式的重大改进,而且随着 WebAssembly 开始在我们的生活中变得更加突出,我们无疑会看到更多重大改进。

介绍


因此,在本教程中,我认为构建一个非常简单的前端框架的基础是一个好主意,该框架用 Go 编写,可编译成 WebAssembly。至少,这将包括以下功能:

【Go语言高级开发】Go 中的安全编码 - 输入验证

介绍


首先,我要感谢 Elliot Forbes 有机会在这个领域进行合作。我的名字是阿卜杜拉·加西亚。我是一位经验丰富的安全工程师,在广泛的行业领域拥有十多年的成功设计和交付高质量解决方案的经验;对于好奇的人,您可以在 LinkedIn 中找到更多详细信息。我也是一名神经科学家,专注于结合虚拟现实、ML 和假肢的运动神经康复的脑机接口 (BCI)。最后,在业余时间,我喜欢风景/城市/街头摄影(https://abdullahgarcia.myportfolio.com)、旅行、烹饪/烘焙以及各种运动……等等。

本文是几篇文章中的第一篇,其目标是:

  • 了解无论您使用哪种编码语言都适用的通用安全编码最佳实践。
  • 了解使用 Go 编码时如何应对 OWASP 十大(2017)安全风险。

特别是这个:

【Go语言高级开发】Go 指针教程

在本教程中,我们将介绍 Go 中的指针以及如何在自己的 Go 程序中使用它们。我们将介绍最佳实践,并介绍一些最常见的指针用例。

在本教程结束时,您将对指针以及如何使用它们有一个扎实的理解。

介绍


在 Go 中,当我们调用一个函数并将一堆参数传递给该函数时,该语言会创建参数的副本,然后在所述函数中使用这些副本。例如:

main.go

package main

import "fmt"

func myTestFunc(a int) {
    a += 3
    fmt.Println(a)
}

func main() {
    a := 2
    myTestFunc(a)
    fmt.Println(a) // prints out 2
}

在上面的代码中,myTestFunc 接收一个整数变量,并对其进行复制,以便在函数体的上下文中使用。我们对 myTestFunc 中的 a 所做的任何更改都只会保留在 myTestFunc 函数的主体中。

现在,假设我们想调用 myTestFunc 并更新原来的 a 变量并将 3 添加到它?