<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Golang on Jermineの博客 </title>
    <link>https://Jermine.vdo.pub/tags/golang/</link>
    <description>Recent content in Golang on Jermineの博客 </description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 29 Nov 2017 13:51:36 +0800</lastBuildDate>
    <atom:link href="https://Jermine.vdo.pub/tags/golang/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>记defer中的一些坑</title>
      <link>https://Jermine.vdo.pub/go/%E8%AE%B0defer%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</link>
      <pubDate>Wed, 29 Nov 2017 13:51:36 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/%E8%AE%B0defer%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</guid>
      <description>&lt;p&gt;什么是 defer？如何理解 defer 关键字？Go 中使用 defer 的一些坑。&lt;/p&gt;&#xA;&lt;p&gt;defer 意为延迟，在 golang 中用于延迟执行一个函数。它可以帮助我们处理容易忽略的问题，如资源释放、连接关闭等。但在实际使用过程中，有一些需要注意的地方（坑），下面我们一一道来。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang生成C/C&#43;&#43;可调用的动态库.so和静态库</title>
      <link>https://Jermine.vdo.pub/go/golang%E7%94%9F%E6%88%90c%E5%8F%AF%E8%B0%83%E7%94%A8%E7%9A%84%E5%8A%A8%E6%80%81%E5%BA%93.so%E5%92%8C%E9%9D%99%E6%80%81%E5%BA%93.a/</link>
      <pubDate>Wed, 29 Mar 2017 16:06:08 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/golang%E7%94%9F%E6%88%90c%E5%8F%AF%E8%B0%83%E7%94%A8%E7%9A%84%E5%8A%A8%E6%80%81%E5%BA%93.so%E5%92%8C%E9%9D%99%E6%80%81%E5%BA%93.a/</guid>
      <description>&lt;p&gt;Golang类似于C的静态语言，效率也接近于C，如果Golang也可以导出可供C调用的库，那可以和很多高级语言say goodbye了，goodbye似乎又有点武断，但至少说，Golang可以做很多事，而且效率优于很多高级语言，这样说应该没有问题。&#xA;接下来，就从三个方面分别来介绍Golang中关于库的使用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang与C互用以及调用C的so动态库和a静态库</title>
      <link>https://Jermine.vdo.pub/go/golang%E4%B8%8Ec%E4%BA%92%E7%9B%B8%E8%B0%83%E7%94%A8%E4%BB%A5%E5%8F%8A%E8%B0%83%E7%94%A8c%E7%9A%84so%E5%8A%A8%E6%80%81%E5%BA%93%E5%92%8Ca%E9%9D%99%E6%80%81%E5%BA%93/</link>
      <pubDate>Thu, 23 Feb 2017 16:48:24 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/golang%E4%B8%8Ec%E4%BA%92%E7%9B%B8%E8%B0%83%E7%94%A8%E4%BB%A5%E5%8F%8A%E8%B0%83%E7%94%A8c%E7%9A%84so%E5%8A%A8%E6%80%81%E5%BA%93%E5%92%8Ca%E9%9D%99%E6%80%81%E5%BA%93/</guid>
      <description>&lt;p&gt;Golang与C的关系非常密切，下面主要介绍在Golang中使用C。&lt;/p&gt;&#xA;&lt;h2 id=&#34;golang中嵌入c代码&#34;&gt;Golang中嵌入C代码&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-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 style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; void Hello(char *str) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     printf(&amp;#34;%s\n&amp;#34;, str);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//假设把C当成包，其实有点类似C++的名字空间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unsafe&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//C指针的使用，在C代码中申请的空间，GC垃圾回收机制不会管理，所以需要自己手动free申请的空间&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello Cgo&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;cs&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;C&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;CString&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;C&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Hello&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cs&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;C&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;free&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;unsafe&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Pointer&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;cs&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3,4行的注释也可以写/* */形式&#xA;第4行与第5行之间不能有空行，同样第9行与第10行之间也不&#xA;能有行，否则编译时cgo会报错：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go语言静态库的编译和使用</title>
      <link>https://Jermine.vdo.pub/go/go%E8%AF%AD%E8%A8%80%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E7%BC%96%E8%AF%91%E5%92%8C%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Mon, 29 Aug 2016 16:37:16 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/go%E8%AF%AD%E8%A8%80%E9%9D%99%E6%80%81%E5%BA%93%E7%9A%84%E7%BC%96%E8%AF%91%E5%92%8C%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;p&gt;本文主要介绍go语言静态库的编译和使用方法，以windows平台为例，linux平台步骤一样，具体环境如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;echo %GOPATH%&#xA;E:\share\git\go_practice\&#xA;&#xA;&amp;gt;echo %GOROOT%&#xA;C:\Go\&#xA;&#xA;&amp;gt;tree /F %GOPATH%\src&#xA;卷 work 的文件夹 PATH 列表&#xA;卷序列号为 0009-D8C8&#xA;E:\SHARE\GIT\GO_PRACTICE\SRC&#xA;│  main.go&#xA;│&#xA;└─demo&#xA;        demo.go&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在&lt;code&gt;%GOPATH%\src&lt;/code&gt;目录，有demo包和使用demo包的应用程序&lt;code&gt;main.go&lt;/code&gt;，&lt;code&gt;main.go&lt;/code&gt;代码如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>浅谈Golang sync</title>
      <link>https://Jermine.vdo.pub/go/%E6%B5%85%E8%B0%88_golang_sync_/</link>
      <pubDate>Sat, 23 Jul 2016 16:37:16 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/%E6%B5%85%E8%B0%88_golang_sync_/</guid>
      <description>&lt;p&gt;尽管 Golang 推荐通过 channel 进行通信和同步，但在实际开发中 sync 包用得也非常的多。另外 sync 下还有一个 atomic 包，提供了一些底层的原子操作（这里不做介绍）。本篇文章主要介绍该包下的锁的一些概念及使用方法。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang Cross Compiled Config - go语言跨平台交叉编译</title>
      <link>https://Jermine.vdo.pub/go/go-cross-compiled-config/</link>
      <pubDate>Wed, 23 Mar 2016 14:14:13 +0800</pubDate>
      <guid>https://Jermine.vdo.pub/go/go-cross-compiled-config/</guid>
      <description>&lt;h1 id=&#34;go在各个平台交叉编译的介绍&#34;&gt;go在各个平台交叉编译的介绍&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;Golang&lt;/code&gt; 支持交叉编译，在一个平台上生成另一个平台的可执行程序，最近使用了一下，非常好用，这里备忘一下。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mac-下的交叉编译&#34;&gt;Mac 下的交叉编译&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Mac&lt;/code&gt; 下编译 &lt;code&gt;Linux&lt;/code&gt; 和 &lt;code&gt;Windows 64&lt;/code&gt; 位可执行程序&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go &#xA;CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;linux-下的交叉编译&#34;&gt;Linux 下的交叉编译&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Linux&lt;/code&gt; 下编译 &lt;code&gt;Mac&lt;/code&gt; 和 &lt;code&gt;Windows 64&lt;/code&gt;位可执行程序&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
