From 03b5244f6df94e2dd1a163ac1328ed3ae84d6b8a Mon Sep 17 00:00:00 2001 From: AICells <1713699517@qq.com> Date: Fri, 22 May 2020 02:10:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/go方法.md | 9 ++++++ src/learn/{menth.go => method.go} | 0 src/learn/methodSet.go | 33 +++++++++++++++++++ src/learn/overMethod.go | 53 +++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) rename src/learn/{menth.go => method.go} (100%) create mode 100644 src/learn/methodSet.go create mode 100644 src/learn/overMethod.go diff --git a/src/docs/go方法.md b/src/docs/go方法.md index 1e02519..262df60 100644 --- a/src/docs/go方法.md +++ b/src/docs/go方法.md @@ -6,3 +6,12 @@ 而且为防止混淆 不允许本身是指针的类型进行方法声明 type P *int func (p P) f() {/* ... */} //编译错误 非法的接受者类型 + +# 方法集 + 类型有一个与之相关的方法集(method set) 这决定了他是否实现了某个接口 + + 类型T方法集包含了所有 receiver T方法 + 类型*T方法集包含了所有receiver T + *T方法 + 匿名嵌入S, T方法集包含了所有 receiver S方法 + 匿名嵌入*S, T方法集包含了所有receiver S + *S方法 + 匿名嵌入S或*S, *T方法集包含了所有receiver S+ *S方法 diff --git a/src/learn/menth.go b/src/learn/method.go similarity index 100% rename from src/learn/menth.go rename to src/learn/method.go diff --git a/src/learn/methodSet.go b/src/learn/methodSet.go new file mode 100644 index 0000000..68dd32b --- /dev/null +++ b/src/learn/methodSet.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "reflect" +) + +type S struct{} + +type T struct { + S +} + +func (S) sVal() {} +func (*S) sPtr() {} +func (T) tVal() {} +func (*T) tPtr() {} + +func methodSet(I interface{}) { + t := reflect.TypeOf(I) + fmt.Println(t) + for i, n := 0, t.NumMethod(); i < n; i++ { + m := t.Method(i) + fmt.Println(m.Name, m.Type) + } +} + +func main() { + var t T + methodSet(t) + println("-----------------") + methodSet(&t) +} diff --git a/src/learn/overMethod.go b/src/learn/overMethod.go new file mode 100644 index 0000000..6c81d04 --- /dev/null +++ b/src/learn/overMethod.go @@ -0,0 +1,53 @@ +package main + +type Str interface { + toStr() + add() +} + +type user struct { + a int + b string +} + +type manger struct { + *user + aa int + bb string +} + +func (u user) toStr() { + println("IMY********user", u.a, " ", u.b) +} + +func (u user) add() { + println("IMY********user222", u.a, " ", u.b) +} + +func (m manger) toStr() { + println("IMY********manger") +} + +func overa(s Str) { + println("TEST********", s) + s.toStr() +} + +func overb(s Str) { + println("TEST********", s) + s.add() +} + +func main() { + var m manger = manger{&user{22, "22uuuuuuuu"}, 1, "mmmmm"} + var u user = user{2, "uuuuuuuuu"} + + u.toStr() + m.toStr() + + overa(m) + overa(u) + + overb(u) + overb(m) +}