<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>深度解密 on </title>
    <link>https://note.lican.site/tags/%E6%B7%B1%E5%BA%A6%E8%A7%A3%E5%AF%86/</link>
    <description>Recent content in 深度解密 on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Sat, 07 Nov 2020 15:01:51 +0800</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/%E6%B7%B1%E5%BA%A6%E8%A7%A3%E5%AF%86/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>解密 Go 语言之反射 reflect</title>
      <link>https://note.lican.site/posts/posts/go/reflect/</link>
      <pubDate>Sat, 07 Nov 2020 15:01:51 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/go/reflect/</guid>
      <description>&lt;p&gt;大家好，我是煎鱼。&lt;/p&gt;&#xA;&lt;p&gt;在所有的语言中，反射这一功能基本属于必不可少的模块。虽说 “反射” 这个词让人根深蒂固，但更多的还是 WHY。反射到底是什么，反射又是基于什么法则实现的？&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/47976eb32b9cb5bdbe1869123fefb92b.jpg&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;今天我们通过这篇文章来一一揭晓，以 Go 语言为例，了解反射到底为何物，其底层又是如何实现的。&lt;/p&gt;&#xA;&lt;h2 id=&#34;反射是什么&#34;&gt;反射是什么&lt;/h2&gt;&#xA;&lt;p&gt;在计算机学中，反射是指计算机程序在运行时（runtime）可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说，反射就是程序在运行的时候能够 “观察” 并且修改自己的行为（来自维基百科）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://image.eddycjy.com/96394a2bb7b1dd964b5197837781e348.jpg&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;简单来讲就是，应用程序能够在运行时观察到变量的值，并且能够修改他。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一个例子&#34;&gt;一个例子&lt;/h2&gt;&#xA;&lt;p&gt;最常见的 reflect 标准库例子，如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import (&#xA;&#x9;&amp;#34;fmt&amp;#34;&#xA;&#x9;&amp;#34;reflect&amp;#34;&#xA;)&#xA;&#xA;func main() {&#xA;&#x9;rv := []interface{}{&amp;#34;hi&amp;#34;, 42, func() {}}&#xA;&#x9;for _, v := range rv {&#xA;&#x9;&#x9;switch v := reflect.ValueOf(v); v.Kind() {&#xA;&#x9;&#x9;case reflect.String:&#xA;&#x9;&#x9;&#x9;fmt.Println(v.String())&#xA;&#x9;&#x9;case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:&#xA;&#x9;&#x9;&#x9;fmt.Println(v.Int())&#xA;&#x9;&#x9;default:&#xA;&#x9;&#x9;&#x9;fmt.Printf(&amp;#34;unhandled kind %s&amp;#34;, v.Kind())&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;输出结果：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hi&#xA;42&#xA;unhandled kind func&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在程序中主要是声明了 rv 变量，变量类型为 &lt;code&gt;interface{}&lt;/code&gt;，其包含 3 个不同类型的值，分别是字符串、数字、闭包。一般 &lt;code&gt;interface{}&lt;/code&gt; 的使用常见于不知道入参者具体的基本类型是什么，那么就会用 &lt;code&gt;interface{}&lt;/code&gt; 类型来做一个伪 “泛型”。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
