教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go Reflect

Go Reflect

发布时间:2021-12-25   编辑:jiaochengji.com
教程集为您提供Go Reflect等资源,欢迎您收藏本站,我们将为您提供最新的Go Reflect资源

<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

[关闭]
~ ~