当前位置: 首页 > article >正文

Go语言现代web开发15 泛型和错误

泛型

Generics are new concepts added in Go version 1.18. Designers have long fought against adding support for generic, citing that it would break the simplicity of the design, and the empty interface can be used instead of it.

泛型是Go 1.18版本中添加的新概念。设计师们长期以来一直反对增加对通用的支持,理由是它会破坏设计的简单性,而且可以用空接口来代替它。

When can we use generics? If we want to have a function that checks if an element is present in the array, we must declare a function for each type (integer arrays, string arrays, and so on). Generally, these functions will have the same code base, iterate through the array, and check if the current element is the one we are looking for.

什么时候可以使用泛型?如果希望有一个检查数组中是否存在元素的函数,则必须为每种类型(整数数组、字符串数组等)声明一个函数。通常,这些函数将具有相同的代码库,遍历数组,并检查当前元素是否为我们要查找的元素。

We can create a generic function by introduding the type parameter (in square brackets between the function name and function arguments), and use it in the function signature. Here is an example of Contains() function implemented with generics.

我们可以通过引入类型参数(在函数名和函数实参之间的方括号中)来创建泛型函数,并在函数签名中使用它。下面是一个用泛型实现的Contains()函数的例子。

func Contains[T comparable](s []T, e T) bool {
	for _, a := range s {
		if a == e {
			return true
		}
	}
	return false
}

func main() {
	arr := []int{1, 2, 3, 4, 5}
	arr2 := []string{"a", "b", "c", "d"}

	fmt.Println(Contains(arr, 3))
	fmt.Println(Contains(arr2, "c"))
}

T can be any type that fulfills compareable constraints (all types that support equality operators == and !=).

T 可以是任意的,支持 == 和 != 比较运算符的类型。

Besides function generics, we can declare generic types. In the next example, we will define a type for the node which can be used in the implementation of a binary tree. In binary trees, each node can reference at most two other nodes(usually called left and right child) and hold value.

除了函数泛型,我们还可以声明泛型类型。在下一个示例中,我们将为节点定义一个类型,该类型可用于二叉树的实现。在二叉树中,每个节点最多可以引用两个其他节点(通常称为左子节点和右子节点)并保持值。

type Node[T any] struct {
	leftChild  *Node[T]
	rightChild *Node[T]
	value      T
}

Constraint any is basically an alias for the empty interface, so any type can be used in place of T.

约束any基本上是空接口的别名,因此任何类型都可以用来代替T。

panic 错误处理

Panic is a built-in function that stops the regular flow, similar to the concept of runtime exceptions from other programming language (Java). When it is triggered, the message printed on standard output and function execution will be terminated.

Panic是一个停止常规流的内置函数,类似于其他编程语言(Java)中的运行时异常概念。当它被触发时,在标准输出和函数执行上打印的消息将被终止。

Panic is often triggered by unexpected errors. Some examples of the most common unexpected errors are:

  • Invalid memoery address or nil pointer difference
  • Divide by zero
  • Index out of range

恐慌通常是由意想不到的错误引发的。一些最常见的意外错误的例子是:

  • 无效的内存地址或空指针差异
  • 除以零
  • 索引超出范围

In the following example, panic Index out of range will be triggered.

在下面的示例中,索引越界的异常将会被触发。

func main() {
    s:= []int{1,2,3}
    fmt.Println(s[3])
}

Panic can be explicitly triggered in code by calling pani() function. This is often used for error handling, like in the following example.

可以通过调用pani()函数在代码中显式触发Panic。这通常用于错误处理,如下面的示例所示。

func checkName(name string) {
    if name == "" {
        panic("Invalid name!!!")
    }
}

It is not a good practice to use panics for normal error handling.

将panic用于正常的错误处理并不是一个好的做法。


http://www.kler.cn/a/307328.html

相关文章:

  • 卷积神经网络之Yolo详解
  • 批量重命名Excel文件并排序
  • PyTorch深度学习与企业级项目实战-预训练语言模型GPT
  • 深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • 深度学习——优化算法、激活函数、归一化、正则化
  • C++中string字符串类型介绍及数组模拟
  • TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准
  • 如何在 Ubuntu 系统上部署 Laravel 项目 ?
  • 基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台
  • [NSSRound#4 SWPU]hide_and_seek-用gdb调试
  • 美团图床设置教程
  • 基于深度学习的自动化农场管理
  • leetcode14.最长公共前缀
  • 鸿蒙 ArkUI组件二
  • 鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
  • RNN股票预测(Pytorch版)
  • 大模型参数高效微调技术原理综述(八)-MAM Adapter、UniPELT
  • Redhat 8,9系(复刻系列) 一键部署Oracle23ai rpm
  • 模型训练的过程中对学习不好的样本怎么处理更合适
  • Qt4Qt5Qt6版本下载(在线和离线)
  • C++ | Leetcode C++题解之第405题数字转换为十六进制数
  • 文本分类实战项目:如何使用NLP构建情感分析模型
  • Element-ui el-table 全局表格排序
  • 腾讯云软件工程师面试问题收集记录-数据库
  • redis简单使用与安装