Generic

概述

参考:

Generic(泛型) 编程是一种计算机编程的风格,在这种风格中,程序中的数据类型是不固定的(i.e. 广泛的类型),若想让这种不固定的类型固定下来,需要为其提供 类型参数 以便固定成具体的类型。这种编程风格由 1973 年的 ML 编程语言首创,允许编写通用函数或类型,这些函数或类型在使用时仅在操作的类型集上有所不同,从而减少了重复代码。

Generic 也可以看做是以一种特殊的数据类型,就像 string、int 等等数据类型一样,除了具备 Data type 的能力,还多了变化的能力。

假如现在有如下函数:

func g<T any>(i T){
  print(typeof(i))
}

其中函数多了 <T any> 这部分,这就表明,这个函数中使用了泛型,这个广泛的类型标识符为 T(就像字符串的标识符为 string 之类的一样),可以让自己变成 any(任意) 的类型。

有的语言,比如 Go 语言,不是使用 [ ] 符号而不是 < > 来标识泛型语法。

此时我们调用 g 函数

g<int>(1)
g<string>("1")

g<int>(1) 输出的结果为 int,g<string>("string") 输出的结果为 string。此时,调用是使用的 < > 可以理解为约束,就是让 g 函数中的 T 变为指定的类型。

比如使用 g<int>(1) 调用 g 函数时,这个函数相当于变成了 func g(i int){ print(typeof(i)) }

什么时候应该用泛型?

Ian 给出了简要的泛型使用方针,当开发者发现自己多次编写完全相同的代码,而这些副本之间的唯一区别仅在于使用了不同类型,这时候便可以考虑使用类型参数。换句话说,即开发者应避免使用类型参数,直到发现自己要多次编写完全相同的代码。

减少重复的代码

  • 重复代码可能造成的问题:
    • 安全隐患。当多块相同的代码其中一块逻辑修改时,其他相同的逻辑都要修改才能保证整体逻辑一致,但是重复代码过多时,忘记修改某块代码是很难避免的
    • 不利于扩展。当有更多类型需要使用相同逻辑时,每次都要重新写一遍,不利于代码的可读性和可维护性。加重安全隐患。

最后修改 June 12, 2024: data type (a103a962)