<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Go1.17 on </title>
    <link>https://note.lican.site/tags/go1.17/</link>
    <description>Recent content in Go1.17 on </description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© lican.asia All rights reserved</copyright>
    <lastBuildDate>Fri, 31 Dec 2021 12:54:56 +0800</lastBuildDate>
    <atom:link href="https://note.lican.site/tags/go1.17/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>时隔 3 年，Go1.17 增强构建约束！</title>
      <link>https://note.lican.site/posts/posts/go/117-build/</link>
      <pubDate>Fri, 31 Dec 2021 12:54:56 +0800</pubDate>
      <guid>https://note.lican.site/posts/posts/go/117-build/</guid>
      <description>&lt;p&gt;大家好，我是煎鱼。&lt;/p&gt;&#xA;&lt;p&gt;Go1.17rc1 在前几天终于正式发布了：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://files.mdnice.com/user/3610/a9dd1134-e4f8-4d9c-9c3c-2608728ddf69.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;看到 Go1.17 增加了一个新特性，是面向 Go 构建时的构建约束的增强。认真一看，是一个时隔 3 年的提案了，原本还在 Go2 和 Go1 之间左右摇摆，这下在 6 月底 Russ Cox 就输出了新草案：《Bug-resistant build constraints — Draft Design》。紧接着直接计划在 Go1.17 发布了。&lt;/p&gt;&#xA;&lt;p&gt;一气呵成，真实版高效能了。&lt;/p&gt;&#xA;&lt;p&gt;如下图：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://files.mdnice.com/user/3610/10037273-887d-45c0-9eca-6ef36d7c4d72.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;之前小咸鱼有遇到好几个朋友，在报错时压根不知道 Go 有这个约束语法，以为只是个单纯的注释，直接不明所以然，感觉科普之路任重道远。&lt;/p&gt;&#xA;&lt;p&gt;今天这篇文章煎鱼就来讲讲构建约束这事。&lt;/p&gt;&#xA;&lt;p&gt;注：下个月 Go1.17 就会正式发布，距离 Go1.18 泛型出山只差一点点距离了，值得期待！&lt;/p&gt;&#xA;&lt;h2 id=&#34;构建约束的背景&#34;&gt;构建约束的背景&lt;/h2&gt;&#xA;&lt;p&gt;简单来讲，在真实环境中，可能需要为不同的编译环境编写不同的 Go 代码，所以需要做构建约束。&lt;/p&gt;&#xA;&lt;p&gt;划重点，Go 语言对这一问题的解决方案是&lt;strong&gt;在文件层面进行有条件的编译：每个文件要么在编译中，要么不在&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;也就是，假设不符合构建约束的场景。那么会直接不编译这个文件，因为他不在编译范围内。那在程序想运行时就会报错，表示找不到文件。因此有许多的同学看着报错信息，经常找不着北&amp;hellip;&lt;/p&gt;&#xA;&lt;h2 id=&#34;现有的构建约束&#34;&gt;现有的构建约束&lt;/h2&gt;&#xA;&lt;p&gt;既然是叫 “增强”。说明现有就有构建约束。最早的构建约束是在 2011 年 9 月引入的构建约束。&lt;/p&gt;&#xA;&lt;p&gt;我们平时常见的构建约束（build constraint），也叫做构建标记（build tag），构建约束必须出现在 &lt;code&gt;package&lt;/code&gt; 之前。&lt;/p&gt;&#xA;&lt;p&gt;平时会在 Go 工程的文件中的最开始会看到如下行注解：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// +build&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;为了将构建约束与包文档区分开来，构建约束后必须跟一个空行。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// +build linux,386 darwin,!cgo&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;又或是：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// +build linux darwin&#xA;// +build amd64&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;还可以根据 Go 版本来约束：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
