<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>inasayang&#39;s blog</title>
    <link>/</link>
    <description>Recent blog posts on inasayang&#39;s blog</description>
    
    <generator>Hugo (https://gohugo.io)</generator>
    
    <language>zh-cn</language>
    
    <managingEditor>xiayangzzw@gmail.com (inasayang)</managingEditor>
    
    <webMaster>xiayangzzw@gmail.com (inasayang)</webMaster>
    
    <lastBuildDate>Mon, 21 Apr 2025 00:00:00 Z</lastBuildDate>
    
    <atom:link href="/tags/unsafe/index.xml" rel="self" type="application/rss+xml" />
    

    <item>
      <title>Go | 跨包访问非导出符号</title>
      <link>/posts/250421_call_unexported_fn_and_var/25_04_21_call_unexported_fn_and_var/</link>
      <pubDate>Mon, 21 Apr 2025 00:00:00 Z</pubDate>
      
      <author>xiayangzzw@gmail.com (inasayang)</author>

      
      
      
      

      <description>
      
      </description>
      <content:encoded>&lt;p&gt;&lt;code&gt;//go:linkname&lt;/code&gt; 是 &lt;code&gt;Go&lt;/code&gt; 语言中的一个编译指令（&lt;code&gt;compiler directive&lt;/code&gt;），用于在编译期间将一个符号（函数或变量）的名称重命名成另一个符号，达到在不同包之间绕过封装直接访问非导出（&lt;code&gt;unexported&lt;/code&gt;）标识符的效果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要导入 &lt;code&gt;unsafe&lt;/code&gt; 包&lt;/li&gt;
&lt;li&gt;函数或变量必须声明&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用未导出函数示例1&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%87%bd%e6%95%b0%e7%a4%ba%e4%be%8b1&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出函数（示例1）：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; mypkg
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname privateFunc runtime.internalFunc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;privateFunc&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里 &lt;code&gt;mypkg&lt;/code&gt; 包里的 &lt;code&gt;privateFunc&lt;/code&gt; 会被链接为 &lt;code&gt;runtime&lt;/code&gt; 包中的非导出函数 &lt;code&gt;internalFunc&lt;/code&gt;，调用&lt;code&gt;privateFunc()&lt;/code&gt; 就是调用的 &lt;code&gt;runtime.internalFunc()&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;使用未导出函数示例2&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%87%bd%e6%95%b0%e7%a4%ba%e4%be%8b2&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出函数（示例2）：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;github.com/xxx/yyy/zzz&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;// 确保包被导入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname newUUID github.com/xxx/yyy/zzz.newUUID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;newUUID&lt;/span&gt;() &lt;span style=&#34;color:#e78284&#34;&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s &lt;span style=&#34;color:#99d1db;font-weight:bold&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#8caaee&#34;&gt;newUUID&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fmt.&lt;span style=&#34;color:#8caaee&#34;&gt;Println&lt;/span&gt;(s)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用未导出变量&#34; &gt;
&lt;div&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e6%9c%aa%e5%af%bc%e5%87%ba%e5%8f%98%e9%87%8f&#34;&gt;
        #
    &lt;/a&gt;
    使用未导出变量：
&lt;/div&gt;
&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;package&lt;/span&gt; yourpkg
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81c8be&#34;&gt;import&lt;/span&gt; _ &lt;span style=&#34;color:#a6d189&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#737994;font-style:italic&#34;&gt;//go:linkname someValue github.com/xxx/yyy/zzz.someValue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e78284&#34;&gt;var&lt;/span&gt; someValue &lt;span style=&#34;color:#e78284&#34;&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded>
      
      <category>go</category>
      
      <category>unsafe</category>
      
      
      <guid isPermaLink="true">/posts/250421_call_unexported_fn_and_var/25_04_21_call_unexported_fn_and_var/</guid>
    </item>
    
  </channel>
</rss>
