<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>NotionNext BLOG</title>
        <link>https://evansblog.vercel.app//</link>
        <description>这是一个由NotionNext生成的站点</description>
        <lastBuildDate>Tue, 10 Oct 2023 07:54:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2023, Evans</copyright>
        <item>
            <title><![CDATA[Golang 那些事：HTTP Header 的那些坑]]></title>
            <link>https://evansblog.vercel.app//article/Golang</link>
            <guid>https://evansblog.vercel.app//article/Golang</guid>
            <pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[最近开发中要对 HTTP Header 进行一些操作，记录一下不会特别注意但容易造成问题的地方]]></description>
            <content:encoded><![CDATA[<div id="container" class="font-medium mx-auto undefined"><main class="notion light-mode notion-page notion-block-e829af9fbbfd47e98c7a7e59a497c36e"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-ac983096a7a14ef59e11d1b0f3bc9978" data-id="ac983096a7a14ef59e11d1b0f3bc9978"><span><div id="ac983096a7a14ef59e11d1b0f3bc9978" class="notion-header-anchor"></div><a class="notion-hash-link" href="#ac983096a7a14ef59e11d1b0f3bc9978" title="ResponseWriter.Write 会导致客户端收到错误的 HTTP 状态码"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b><b>ResponseWriter.Write 会导致客户端收到错误的 HTTP 状态码</b></b></span></span></h2><div class="notion-text notion-block-5ae07799a9e44a9188199d25eebf8de2">首先看看下面这段代码，猜猜看客户端会收到什么样的状态码？</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-go">// server.go
http.HandleFunc(&quot;/&quot;, func (w http.ResponseWriter, r *http.Request) {
    w.Write([]byte(&quot;Hello&quot;))
    w.WriteHeader(http.StatusBadRequest)
})</code></pre><div class="notion-text notion-block-ef9acf44cd084de7ae978f9e3fac3daf">觉得应该是 400 Bad Request? No no no, 正确答案是 200 ok</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-go">$ curl -i http://127.0.0.1:8080
HTTP/1.1 200 OK
Date: Fri, 02 Dec 2022 13:11:53 GMT
Content-Length: 6
Content-Type: text/plain; charset=utf-8

Hello</code></pre><div class="notion-text notion-block-e753ec72cd354175b3d91ac50c6c201f">并且会在控制台打印出以下 log</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-go">2022/12/02 13:11:53 http: multiple response.WriteHeader calls</code></pre><div class="notion-text notion-block-164f00105934413d8827d52a54764441">造成这个的原因是 <code class="notion-inline-code">WriteHeader</code> 和 <code class="notion-inline-code">Write</code> 的调用顺序，官方文档中对于这个问题是这样解释的</div><blockquote class="notion-quote notion-block-74588c58df924e8298756deb1b223263"><div><em>If </em><em><b>WriteHeader</b></em><em> is not called explicitly, the first call to </em><em><b>Write</b></em><em> will trigger an implicit WriteHeader(http.StatusOK).</em></div></blockquote><div class="notion-text notion-block-922f37f3e7b9418bba343fb2a1a1f88a">也就是说，如果先调用 Write，就会自动将状态码设置为 <code class="notion-inline-code">http.StatusOK</code>，而后续再调用 WriteHeader 就会导致多次写入状态码，会使客户端无法收到正确的状态</div><div class="notion-blank notion-block-2f1c4476f84949a0b8638b31703e5096"> </div><div class="notion-text notion-block-8970e315df1d4b58aafdcb519a6d34c6">所以如果要想返回正确的错误发，需要先调用 <code class="notion-inline-code">WriteHeader</code> 设置状态码，再调用 <code class="notion-inline-code">Write</code> 写入 body</div><div class="notion-blank notion-block-2e96e4f1468e4e379c5723e48bf793e9"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[函数式编程：代码简洁之道？]]></title>
            <link>https://evansblog.vercel.app//article/9f55edf7-88f4-49e5-ba63-ac67d5246a18</link>
            <guid>https://evansblog.vercel.app//article/9f55edf7-88f4-49e5-ba63-ac67d5246a18</guid>
            <pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[函数式编程是一种强大的编程范式，它强调函数的纯粹性和不可变性，以及避免共享状态和可变数据，那么要如何使用函数式编程的思想来编写更简洁、可读性更高、可维护性更好的代码呢？]]></description>
            <content:encoded><![CDATA[<div id="container" class="font-medium mx-auto undefined"><main class="notion light-mode notion-page notion-block-9f55edf788f449e5ba63ac67d5246a18"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-c6afb5445b7e4ad6b85b0fb8c763b4f8"><div>函数式编程是一种编程范式，它强调函数的纯粹性和不可变性，以及避免共享状态和可变数据。在函数式编程中，函数被视为一等公民，可以像其他值一样传递和操作。在本文中，我们将介绍函数式编程的一些基本概念，并使用 TypeScript 编写一些示例代码。</div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-ba03948ea47948a29f23e29c5d5b6c0c" data-id="ba03948ea47948a29f23e29c5d5b6c0c"><span><div id="ba03948ea47948a29f23e29c5d5b6c0c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#ba03948ea47948a29f23e29c5d5b6c0c" title="纯函数"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>纯函数</b></span></span></h2><div class="notion-text notion-block-2a757eb467ef459d8f8e94853038d646">在函数式编程中，函数被定义为纯函数，即不依赖于外部状态或可变数据，并且对于相同的输入始终返回相同的输出。纯函数不会修改其输入参数，也不会产生副作用。这使得纯函数易于测试和推理，并且可以更容易地进行并发和并行处理。</div><div class="notion-text notion-block-dff5d2c79bf145548bbe6976efceb28d">以下是一个纯函数的示例：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-typescript">function add(a: number, b: number): number {
  return a + b;
}</code></pre><div class="notion-text notion-block-1395efe38ac340f3b585e023b681df03">这个函数接受两个数字作为参数，并返回它们的和。它不会修改任何输入参数，也不会产生副作用。因此，它是一个纯函数。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-dc879bee4c3b419c876a93fbe2416955" data-id="dc879bee4c3b419c876a93fbe2416955"><span><div id="dc879bee4c3b419c876a93fbe2416955" class="notion-header-anchor"></div><a class="notion-hash-link" href="#dc879bee4c3b419c876a93fbe2416955" title="不可变性"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>不可变性</b></span></span></h3><div class="notion-text notion-block-3a92a08073604151853ab3e11280a7f4">在函数式编程中，数据被视为不可变的，即一旦创建就不能被修改。这意味着我们不能直接修改对象或数组的属性或元素，而是需要创建一个新的对象或数组来代替原始对象或数组。</div><div class="notion-text notion-block-31128711a0ec4a0791faebb1715f70be">以下是一个使用不可变性的示例：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-typescript">interface Person {
  name: string;
  age: number;
}

const person: Person = { name: &quot;John&quot;, age: 30 };

const updatedPerson: Person = { ...person, age: 31 };
</code></pre><div class="notion-text notion-block-f055026770b2492b8c47a3957f54d77c">在这个示例中，我们创建了一个名为<code class="notion-inline-code"><b>person</b></code>的对象，它具有<code class="notion-inline-code"><b>name</b></code>和<code class="notion-inline-code"><b>age</b></code>属性。然后，我们使用扩展运算符创建了一个新的对象<code class="notion-inline-code"><b>updatedPerson</b></code>，它具有与<code class="notion-inline-code"><b>person</b></code>相同的<code class="notion-inline-code"><b>name</b></code>属性，但<code class="notion-inline-code"><b>age</b></code>属性的值增加了1。由于对象是不可变的，因此我们需要创建一个新的对象来代替原始对象。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-d74bc9e494944e20b5a26a6ce8e7d75c" data-id="d74bc9e494944e20b5a26a6ce8e7d75c"><span><div id="d74bc9e494944e20b5a26a6ce8e7d75c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d74bc9e494944e20b5a26a6ce8e7d75c" title="高阶函数"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>高阶函数</b></span></span></h3><div class="notion-text notion-block-f899bf72abc148dfa22c55ab278e4ca5">在函数式编程中，函数可以作为参数传递给其他函数，或者作为返回值从函数中返回。这些函数被称为高阶函数。</div><div class="notion-text notion-block-982e1986f7e04350a2a1947d2bf841d6">以下是一个高阶函数的示例：</div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-typescript">function multiplyBy(factor: number): (value: number) =&gt; number {
  return (value: number) =&gt; value * factor;
}

const double = multiplyBy(2);
const triple = multiplyBy(3);

console.log(double(5));// 输出 10
console.log(triple(5));// 输出 15
</code></pre><div class="notion-text notion-block-1c431990fba24addb8ec17007be20e70">在这个示例中，我们定义了一个名为<code class="notion-inline-code"><b>multiplyBy</b></code>的函数，它接受一个数字作为参数，并返回一个函数，该函数接受另一个数字作为参数，并将其乘以传递给<code class="notion-inline-code"><b>multiplyBy</b></code>函数的数字。然后，我们使用<code class="notion-inline-code"><b>multiplyBy</b></code>函数创建了两个新的函数<code class="notion-inline-code"><b>double</b></code>和<code class="notion-inline-code"><b>triple</b></code>，它们分别将其输入值乘以2和3。最后，我们使用这些函数将数字5乘以2和3，并将结果打印到控制台上。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-3a85b9be697a400aa2bc254b1c83bfdd" data-id="3a85b9be697a400aa2bc254b1c83bfdd"><span><div id="3a85b9be697a400aa2bc254b1c83bfdd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#3a85b9be697a400aa2bc254b1c83bfdd" title="对比"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>对比</b></span></span></h3><div class="notion-text notion-block-5fc489232a4649e888caa15aff47605f">让我们来看一下使用函数式编程和命令式编程编写的相同功能的代码示例。</div><div class="notion-text notion-block-141c809389e547e48733ba1ca87b7703"><b><b>命令式编程示例</b></b></div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-typescript">interface Person {
  name: string;
  age: number;
}

const people: Person[] = [
  { name: &quot;John&quot;, age: 30 },
  { name: &quot;Jane&quot;, age: 25 },
  { name: &quot;Bob&quot;, age: 40 },
];

const filteredPeople: Person[] = [];

for (let i = 0; i &lt; people.length; i++) {
  if (people[i].age &gt;= 30) {
    filteredPeople.push(people[i]);
  }
}

const sortedPeople: Person[] = [];

for (let i = 0; i &lt; filteredPeople.length; i++) {
  let inserted = false;
  for (let j = 0; j &lt; sortedPeople.length; j++) {
    if (filteredPeople[i].age &lt; sortedPeople[j].age) {
      sortedPeople.splice(j, 0, filteredPeople[i]);
      inserted = true;
      break;
    }
  }
  if (!inserted) {
    sortedPeople.push(filteredPeople[i]);
  }
}

const names: string[] = [];

for (let i = 0; i &lt; sortedPeople.length; i++) {
  names.push(sortedPeople[i].name);
}

console.log(names); // 输出 [&quot;Bob&quot;, &quot;John&quot;]</code></pre><div class="notion-text notion-block-9b4e9f35b4d0429fa6e7a7632ee4e111">在这个示例中，我们使用了命令式编程的思想来实现相同的功能。我们使用了三个循环来处理人员数组，分别用于过滤、排序和映射人员数组。然后，我们将结果存储在<code class="notion-inline-code"><b>filteredPeople</b></code>
，<code class="notion-inline-code"><b>sortedPeople</b></code>和<code class="notion-inline-code"><b>names</b></code>变量中。最后，我们将<code class="notion-inline-code"><b>names</b></code>数组打印到控制台上。</div><div class="notion-blank notion-block-476a1bc864a74a408b7425d2738a4538"> </div><div class="notion-text notion-block-ff1b4742b71c4397b35ae673f3f5b66f">接下来我们用函数式编程的思想将上面的代码重写一遍。</div><div class="notion-text notion-block-1c5c846ac59048748d992386d204b2f4"><b>函数式编程示例</b></div><pre class="notion-code"><div class="notion-code-copy"><div class="notion-code-copy-button"><svg fill="currentColor" viewBox="0 0 16 16" width="1em" version="1.1"><path fill-rule="evenodd" d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"></path><path fill-rule="evenodd" d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"></path></svg></div></div><code class="language-typescript">interface Person {
  name: string;
  age: number;
}

const people: Person[] = [
  { name: &quot;John&quot;, age: 30 },
  { name: &quot;Jane&quot;, age: 25 },
  { name: &quot;Bob&quot;, age: 40 },
];

const filterByAge = (minAge: number) =&gt; (person: Person) =&gt; person.age &gt;= minAge;
const sortByAge = (a: Person, b: Person) =&gt; a.age - b.age;
const mapToName = (person: Person) =&gt; person.name;

const filteredPeople = people.filter(filterByAge(30));
const sortedPeople = filteredPeople.sort(sortByAge);
const names = sortedPeople.map(mapToName);

console.log(names);// 输出 [&quot;Bob&quot;, &quot;John&quot;]
</code></pre><div class="notion-text notion-block-8e861a7b28fc461fab47c93dad607cef">在这个示例中，我们使用了函数式编程的思想来实现相同的功能。我们定义了三个函数<code class="notion-inline-code"><b>filterByAge</b></code>，<code class="notion-inline-code"><b>sortByAge</b></code>和<code class="notion-inline-code"><b>mapToName</b></code>，它们分别用于过滤、排序和映射人员数组。然后，我们使用这些函数来处理人员数组，并将结果存储在<code class="notion-inline-code"><b>filteredPeople</b></code>，<code class="notion-inline-code"><b>sortedPeople</b></code>和<code class="notion-inline-code"><b>names</b></code>变量中。最后，我们将<code class="notion-inline-code"><b>names</b></code>数组打印到控制台上。</div><div class="notion-blank notion-block-5c6a0ab5194e4f9db6cc9f300c355354"> </div><div class="notion-text notion-block-83fa40df73d646d7a899587c4b2329a4">通过对比可以看出，命令式编程的代码比函数式编程示例更冗长、更难以理解和维护。这是因为命令式编程的思想更加关注如何实现功能，而不是如何组织和抽象代码。因此，在项目开发中，我们应该尽可能使用函数式编程的思想来编写代码，以提高代码的可读性、可维护性和可扩展性。</div><div class="notion-blank notion-block-df29c2a791bc4d6ea1eac46d7fde6962"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-ecc5a4b1ca7f432f97eac4f2668648ee" data-id="ecc5a4b1ca7f432f97eac4f2668648ee"><span><div id="ecc5a4b1ca7f432f97eac4f2668648ee" class="notion-header-anchor"></div><a class="notion-hash-link" href="#ecc5a4b1ca7f432f97eac4f2668648ee" title="总结"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>总结</b></span></span></h4><div class="notion-text notion-block-cac85c439dac486d87802481ca6014ca">在项目开发中，函数式编程的思想可以帮助我们编写更简洁、可读性更高、可维护性更好的代码。以下是一些使用函数式编程的建议：</div><ol start="1" class="notion-list notion-list-numbered notion-block-7869e2eaa2b3438bbce5f6d30486c38d"><li>尽可能使用纯函数，避免共享状态和可变数据。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-4e845e730d7f4f97b9c9639cb7da189e"><li>使用不可变性来处理数据，避免直接修改对象或数组。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-20129658823c4540a11a37b7c32c223f"><li>将函数视为一等公民，使用高阶函数来组合和操作函数。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-32c800fb6c3746c8bffe4518d5462741"><li>使用函数式编程的工具和库，如 Ramda、Lodash-fp 等。</li></ol><div class="notion-text notion-block-cea056f35e824a8d92de5eeb67bfcce9">当然，并不是所有的项目都适合使用函数式编程的思想。在某些情况下，命令式编程可能更加适合。但是，如果您正在编写需要处理大量数据或需要高度可维护性的应用程序，那么函数式编程可能是一个不错的选择。</div><div class="notion-text notion-block-955afc232475465ea534b9a3204fa4a0">总之，函数式编程是一种强大的编程范式，它可以帮助我们编写更好的代码。在项目开发中，我们应该根据具体情况选择合适的编程范式，并尝试使用函数式编程的思想来改进我们的代码。</div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>