File tree Expand file tree Collapse file tree 9 files changed +184
-0
lines changed
testdata/playground/typealias Expand file tree Collapse file tree 9 files changed +184
-0
lines changed Original file line number Diff line number Diff line change
1
+ goplay
Original file line number Diff line number Diff line change
1
+ module goplay
2
+
3
+ go 1.16
4
+
5
+ replace (
6
+ bar => gorm.io/gorm v1.21.0
7
+ foo => gorm.io/gorm v1.20.12
8
+ )
9
+
10
+ require (
11
+ github.com/gorilla/websocket v1.4.2
12
+ golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6
13
+ )
Original file line number Diff line number Diff line change
1
+ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc =
2
+ github.com/gorilla/websocket v1.4.2 /go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE =
3
+ golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 h1:Vv0JUPWTyeqUq42B2WJ1FeIDjjvGKoA2Ss+Ts0lAVbs =
4
+ golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 /go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ =
Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import (
4
+ "goplay/pkg"
5
+ "goplay/pkg/subpkg"
6
+ "goplay/someone"
7
+ "goplay/thirdparty"
8
+ "log"
9
+ )
10
+
11
+ func main () {
12
+ log .SetFlags (log .Lshortfile )
13
+ mainV40 ()
14
+ }
15
+
16
+ func mainV40 () {
17
+ var a thirdparty.X // I don't know/shouldn't have to know at this point that pkg.OwnX exists/will exist
18
+ var b pkg.OwnY // I don't know/shouldn't have to know at this point that subpkg.SubpkgY exists/will exist
19
+
20
+ a = pkg .ReturnsX ()
21
+ b = pkg .ReturnsY ()
22
+
23
+ switch a {
24
+ case thirdparty .TMemI :
25
+ case thirdparty .TMemJ :
26
+ }
27
+
28
+ switch b {
29
+ case pkg .MemM :
30
+ case pkg .MemN :
31
+ }
32
+
33
+ log .Println (a , b )
34
+ }
35
+
36
+ func mainV45 () {
37
+ var a pkg.OwnX // done to latest
38
+ var b subpkg.SubpkgY // done to latest
39
+
40
+ a = pkg .ReturnsX ()
41
+ b = pkg .ReturnsY ()
42
+
43
+ switch a {
44
+ case pkg .TMemI :
45
+ case pkg .TMemJ :
46
+ // case pkg.TMemK:
47
+ }
48
+
49
+ switch b {
50
+ case subpkg .MemM :
51
+ case subpkg .MemN :
52
+ // case subpkg.MemO:
53
+ }
54
+
55
+ log .Println (a , b )
56
+ }
57
+
58
+ func anotherV41 () {
59
+ var c pkg.OwnY // I don't know/shouldn't have to know at this point that someone.SomeonesOwnY exists/will exist
60
+ c = someone .P ()
61
+ switch c {
62
+ case pkg .MemM :
63
+ case pkg .MemN :
64
+ }
65
+ log .Println (c )
66
+ }
67
+
68
+ func anotherV4x () {
69
+ var c someone.SomeonesOwnY
70
+ c = someone .P ()
71
+ switch c {
72
+ case someone .SomeonesMM :
73
+ case someone .SomeonesMN :
74
+ // case someone.SomeonesMO:
75
+ }
76
+ log .Println (c )
77
+ }
78
+
79
+ // type alias
80
+ // assume you use it for code refactoring only
81
+ // assume you do one by one (first type change fully done; then only add new enum members for example
82
+ // don't add new enum members to old/pas type after new/future type is introduced
Original file line number Diff line number Diff line change
1
+ package main
Original file line number Diff line number Diff line change
1
+ package pkg
2
+
3
+ import (
4
+ "goplay/pkg/subpkg"
5
+ "goplay/thirdparty"
6
+ )
7
+
8
+ // Earlier this package was returning third party X type, but now this package
9
+ // wants to return my own X type instead of third party type.
10
+ //
11
+ // Old API: thirdparty.X (to be unreferenced in new API's package -- this package)
12
+ // New API: OwnX
13
+ //
14
+ // (no line of code) -->
15
+ type OwnX = thirdparty.X // -->
16
+ // type OwnX int
17
+
18
+ const (
19
+ TMemI OwnX = thirdparty .TMemI
20
+ TMemJ OwnX = thirdparty .TMemJ
21
+ TMemK OwnX = 1002 // new extra
22
+ )
23
+
24
+ func ReturnsX () OwnX { return TMemI }
25
+
26
+ // is it okay to return here the extra?
27
+ const _ = TMemK // No, because users aren't yet expected to know of OwnX
28
+
29
+ // Earlier this package defined own Y type, but now it wants to move the
30
+ // definition to a dedicated (sub)package.
31
+ //
32
+ // Old API: OwnY (to be removed in old API's package -- this package)
33
+ // New API: subpkg.SubpkgY
34
+ //
35
+ // type OwnY uint -->
36
+ type OwnY = subpkg.SubpkgY // -->
37
+ // (no line of code)
38
+
39
+ const (
40
+ // created these in subpkg, which is going to become the primary package
41
+ // and forwarding to the created ones in subkpkg
42
+ MemM = subpkg .MemM
43
+ MemN = subpkg .MemN
44
+ // at the end these will be become (no line of code)
45
+ )
46
+
47
+ func ReturnsY () subpkg.SubpkgY { return subpkg .MemM }
48
+
49
+ // is it okay to return here the extra?
50
+ const _ = subpkg .MemO // No, because users aren't yet expected to know of SubpkgY
Original file line number Diff line number Diff line change
1
+ package subpkg
2
+
3
+ type SubpkgY uint
4
+
5
+ const (
6
+ MemM SubpkgY = 1
7
+ MemN SubpkgY = 2
8
+ MemO SubpkgY = 3 // extra here
9
+ )
Original file line number Diff line number Diff line change
1
+ package someone
2
+
3
+ import "goplay/pkg"
4
+
5
+ // type OwnY uint -->
6
+ type SomeonesOwnY = pkg.OwnY
7
+
8
+ const (
9
+ SomeonesMM SomeonesOwnY = pkg .MemM
10
+ SomeonesMN SomeonesOwnY = pkg .MemN
11
+ SomeonesMO SomeonesOwnY = 444 // new extra here
12
+ )
13
+
14
+ func P () SomeonesOwnY {
15
+ return SomeonesOwnY (100 )
16
+ }
Original file line number Diff line number Diff line change
1
+ package thirdparty
2
+
3
+ type X int
4
+
5
+ const (
6
+ TMemI = 1000
7
+ TMemJ = 1001
8
+ )
You can’t perform that action at this time.
0 commit comments