Ver código fonte

2022-03-30 15:03

qinghe 3 anos atrás
pai
commit
9c05785905
3 arquivos alterados com 30 adições e 41 exclusões
  1. 6
    8
      chapter1-why-generics.slide
  2. 7
    16
      codes/atomic.go
  3. 17
    17
      codes/print.go

+ 6
- 8
chapter1-why-generics.slide Ver arquivo

@@ -34,31 +34,29 @@ https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-param
34 34
 
35 35
 .code codes/atomic.go /OMIT/,/OMIT/
36 36
 
37
+- 大体逻辑都类似,仅参数类型不同
37 38
 - 每种类型都得实现一遍
38 39
 
39 40
 ## Why generic
40 41
 
41 42
 .code codes/atomic.go /INTR OMIT/,/INTR OMIT/
42 43
 
44
+- 需要写很多”无用“代码
43 45
 - 无法在编译期检查出错误
44 46
 - 类型转换影响性能
45 47
 
46 48
 
47
-## How Generics
49
+## How Generics (overview)
48 50
 
49 51
 ## Type parameters
50 52
 
51
-泛型代码中会用到抽象的数据类型,这个类型叫做`type parameters`(类型参数). 在运行泛型代码的时候,类型形参会被替换为类型实参
53
+泛型编程能够以一个抽象的类型的形式表示函数和数据结构,这个抽象的类型叫做`type parameter`(参数化类型). 在实际运行泛型代码的时候,会以实际类型来替换这个参数化类型
52 54
 
53 55
 .code codes/print.go /PRINT OMIT/,/PRINT OMIT/
54 56
 
55
-类型T该如何被定义?
57
+在Go中,希望每个标识符都能够通过某种方式来进行申明。
56 58
 
57
-
58
-- 类型参数类似于传统的非类型参数
59
-- 需要区分类型参数与非类型参数
60
-
61
-==>  **需要另外一个可选参数列表来确定类型参数**
59
+那么,如何来申明类型T?
62 60
 
63 61
 
64 62
 ## Type parameter

+ 7
- 16
codes/atomic.go Ver arquivo

@@ -3,22 +3,13 @@ package main
3 3
 // OMIT
4 4
 package atomic 
5 5
 
6
-func AddInt32(addr *int32, delta int32) int32 {
7
-	// some codes ...
8
-	return 0
9
-}
10
-func AddInt64(addr *int64, delta int64) int64 {
11
-	// some codes ...
12
-	return 0
13
-}
14
-func AddUint32(addr *uint32, delta uint32) uint32 {
15
-	// some codes ...
16
-	return 0
17
-}
18
-func AddUint64(addr *uint64, delta uint64) uint64 {
19
-	// some codes ...
20
-	return 0
21
-}
6
+func AddInt32(addr *int32, delta int32) (new int32)
7
+
8
+func AddUint32(addr *uint32, delta uint32) (new uint32)
9
+
10
+func AddInt64(addr *int64, delta int64) (new int64)
11
+
12
+func AddUint64(addr *uint64, delta uint64) (new uint64)
22 13
 
23 14
 // OMIT
24 15
 

+ 17
- 17
codes/print.go Ver arquivo

@@ -4,7 +4,7 @@ import "fmt"
4 4
 
5 5
 /**
6 6
 // PRINT OMIT
7
-func Print(s []T) {
7
+func Print(s []T) { // T is a type parameter
8 8
 	for _, v := range s {
9 9
 		fmt.Println(v)
10 10
 	}
@@ -13,39 +13,39 @@ func Print(s []T) {
13 13
 // PRINT OMIT
14 14
 **/
15 15
 
16
-
17 16
 // GEN OMIT
18 17
 func Print[T any](s []T) {
19 18
 	for _, v := range s {
20 19
 		fmt.Println(v)
21 20
 	}
22 21
 }
23
-// GEN OMIT
24 22
 
23
+// GEN OMIT
25 24
 
26
-func main(){
25
+func main() {
27 26
 	// CALL OMIT
28
-	Print[int]([]int{1,2,3,4})
29
-	Print[int32]([]int32{1,2,3,4})
27
+	Print[int]([]int{1, 2, 3, 4})
28
+	Print[int32]([]int32{1, 2, 3, 4})
30 29
 	// CALL OMIT
31 30
 }
32 31
 
33
-
34 32
 /**
35 33
 // CALL MULTI PARAMS OMIT
36
-Map[string,int](map[string]int{"1":1})
34
+func Index[K comparable,V any](m map[K]V, k K) V {
35
+	return m[k]
36
+}
37 37
 
38
+Index[int,string](map[int]string{1:"hello"}, 1)
38 39
 // CALL MULTI PARAMS OMIT
39 40
 
40 41
 
41 42
 */
42 43
 
43
-
44
-func dummy(){
45
-		// CALL TYPE OMIT
46
-		Print([]int{1,2,3})
47
-		// CALL TYPE OMIT
48
-		// COMPLETE CALL OMIT
49
-		Print[int]([]int{1,2,3})
50
-		// COMPLETE CALL OMIT
51
-}
44
+func dummy() {
45
+	// CALL TYPE OMIT
46
+	Print([]int{1, 2, 3})
47
+	// CALL TYPE OMIT
48
+	// COMPLETE CALL OMIT
49
+	Print[int]([]int{1, 2, 3})
50
+	// COMPLETE CALL OMIT
51
+}