<span style="font-family:inherit; font-size:16px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; text-align:justify; background-color:initial">最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。
另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。</span>
go的reflect库有两个重要的类型:
<ul style="margin:0px 0px 1.5em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><li style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
reflect.Type</li><li style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
reflect.Value</li></ul>
Type,Value分别对应对象的类型和值数据
还有两个重要的函数:
<ul style="margin:0px 0px 1.5em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><li style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
reflect.TypeOf(i interface{}) Type
reflect.TypeOf()返回值的类型就是reflect.Type。
</li><li style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
reflect.ValueOf(i interface{}) Value
reflect.ValueIOf()返回值的类型就是reflect.Value
</li></ul>
<h3 style="margin:0px 0px 1em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:normal; line-height:inherit; font-family:Lato,sans-serif; font-size:1.3em; vertical-align:baseline">
reflect.Type</h3>
<blockquote style="margin:0px 0px 1.5em; padding:0px 0px 0px 1.5em; border-width:0px 0px 0px 4px; border-left-style:solid; font-style:italic; font-variant:inherit; font-weight:inherit; line-height:1.5em; font-family:inherit; font-size:1em; vertical-align:baseline; quotes:none; color:rgb(85,85,85); position:relative">
reflect.TypeOf(i interface{}) Type
</blockquote>
因为reflect.Typeof的参数是空接口类型,因此可以接收任意类型的数据。 TypeOf()的返回值是这个接口类型对应的reflect.Type对象。通过Type提供的一些方法,就可以获得这个接口实际的静态类型。
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">9</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">10</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">11</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">12</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">13</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">14</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">15</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">16</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">17</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">18</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">19</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">20</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">21</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">22</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">23</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">24</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:600px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">import (
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> "fmt"
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> "reflect"
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">type Foo struct {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> X string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Y int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">func main() {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var i int = 123
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var f float32 = 1.23
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var l []string = []string{"a", "b", "c"}
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(i)) //int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(f)) //float32
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(l)) //[]string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var foo Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(foo)) //main.Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span></code></pre>
</td>
</tr></tbody></table>
查看reflect包的源代码可以看到,reflect.Type的定义如下:
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">9</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">10</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">11</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">12</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">13</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">14</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:600px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">type Type interface {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Align() int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> FieldAlign() int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Method(int) Method
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> MethodByName(string) (Method, bool)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> NumMethod() int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Name() string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> String() string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Elem() Type
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Field(i int) StructField
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> FieldByName(name string) (StructField, bool)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Len() int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> .....
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span></code></pre>
</td>
</tr></tbody></table>
可见reflect.Type是一个接口类型的对象,这个接口包含了很多方法,像<code style="margin:-1px 0px; padding:0px 0.3em; border:1px solid rgb(221,221,221); font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.5em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:0.8em; vertical-align:baseline; display:inline-block; color:rgb(85,85,85)">Name()</code>,<code style="margin:-1px 0px; padding:0px 0.3em; border:1px solid rgb(221,221,221); font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.5em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:0.8em; vertical-align:baseline; display:inline-block; color:rgb(85,85,85)">Field()</code>,<code style="margin:-1px 0px; padding:0px 0.3em; border:1px solid rgb(221,221,221); font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.5em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:0.8em; vertical-align:baseline; display:inline-block; color:rgb(85,85,85)">Method()</code>等,下面再通过实例来了解几个比较重要的方法。
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">9</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">10</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">11</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">12</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">13</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">14</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">15</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">16</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">17</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">18</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">19</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">20</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">21</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:600px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">type Foo struct {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> X string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Y int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">func (f Foo) do() {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Printf("X is: %s, Y is: %d", f.X, f.Y)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">func main() {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var s string = "abc"
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(s).String()) //string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(reflect.TypeOf(s).Name()) //string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> var f Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> typ := reflect.TypeOf(f)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(typ.String()) //main.Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Println(typ.Name()) //Foo ,返回结构体的名字
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span></code></pre>
</td>
</tr></tbody></table>
上面的例子可见,通过Type.String(),Type.Name()方法就可以获得接口对应的静态类型。 下面几个方法,显示了Type的更多功能,特别是对于结构体对象而言。
<h5 style="margin:0px 0px 1em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:Lato,sans-serif; font-size:0.9em; vertical-align:baseline">
Field相关的方法</h5>
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">9</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">10</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">11</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">12</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:626px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">var f Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">typ := reflect.TypeOf(f)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">for i := 0; i < typ.NumField(); i {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> field := typ.Field(i)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> fmt.Printf("%s type is :%s\n", field.Name, field.Type)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">//x type is :string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">//y type is :int
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">field2, _ := typ.FieldByName("x") //等价于typ.Field(0),返回的也是StructField对象
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">fmt.Println(field2.Name) // x</span></code></pre>
</td>
</tr></tbody></table>
Type的Field是一个StructFiled对象:
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">9</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">10</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:600px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">type StructField struct {
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Name string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> PkgPath string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Type Type // field type
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Tag StructTag // field tag string
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Offset uintptr // offset within struct, in bytes
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Index []int // index sequence for Type.FieldByIndex
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"> Anonymous bool // is an embedded field
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">}
</span></code></pre>
</td>
</tr></tbody></table>
<h5 style="margin:0px 0px 1em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:Lato,sans-serif; font-size:0.9em; vertical-align:baseline">
Method相关的方法</h5>
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
</pre>
</td>
<td class="code" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle; width:652px">
<pre style="margin-top:0px; margin-bottom:0px; padding:0px; border:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; background:none"><code style="margin:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; vertical-align:baseline; overflow-y:hidden; display:block; overflow-x:auto; padding:0.8em!important; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace!important; background:rgb(0,0,0)"><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">var f Foo
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">typ := reflect.TypeOf(f)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">fmt.Println(typ.NumMethod()) //1, Foo 方法的个数
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">m := typ.Method(0)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">fmt.Println(m.Name) //do
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">fmt.Println(m.Type) //func(main.Foo)
</span><span class="line" style="margin:0px; padding:0px; border:0px; font-variant:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline">fmt.Println(m.Func) //<func(main.Foo) Value>, 这个返回的是reflect.Value对象,后面再讲</span></code></pre>
</td>
</tr></tbody></table>
<h5 style="margin:0px 0px 1em; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:Lato,sans-serif; font-size:0.9em; vertical-align:baseline">
Kind</h5>
Kind方法Type和Value都有,它返回的是对象的基本类型,例如int,bool,slice等,而不是静态类型。
<table style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:baseline; border-collapse:collapse; border-spacing:0px"><tbody style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><tr style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline"><td class="gutter" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; line-height:inherit; font-family:inherit; font-size:16px; vertical-align:middle">
<pre class="line-numbers" style="margin-top:0px; margin-bottom:0px; border-top-style:none; border-bottom-style:none; border-left-style:none; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:1.45em; font-family:Menlo,Monaco,'Andale Mono','lucida console','Courier New',monospace; font-size:13px; vertical-align:baseline; color:rgb(147,161,161); overflow:auto; text-align:right; padding:0.8em!important; border-right-width:1px!important; border-right-style:solid!important; border-right-color:rgb(0,35,44)!important; background:none"><span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">1</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">2</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">3</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">4</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">5</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">6</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">7</span>
<span class="line-number" style="margin:0px; padding:0px; border:0px; font-style:inherit; font-variant:inherit; font-weight:inherit; line-height:inherit; font-family:inherit; vertical-align:baseline; color:rgb(88,110,117)!important">8</span>
golang标准库reflect包实现操作任意类型对象
Go语言学习之reflect包(The way to go)
golang获取struct的tag值
Golang reflect机制实现struct 复制/选择复制
Golang反射机制的实现分析——reflect.Type类型名称
Golang 获取变量的类型
图解 Go 反射实现原理
golang map转json的顺序问题
golang的反射机制与实践(上)
Golang使用reflect操作struct