Blue Poison

配置 go 开发环境

由于某些网络原因1,本文所提到的部分网站、下载链接可能在中国大陆地区无法访问,请自行查找解决方案,本文不再赘述。 如果你在阅读本文时遇到了任何问题,请查阅 go 语言官方网站。 下载预编译文件 在 Download Go 选择适合你平台的最新版本文件下载。 本文不推荐使用一键安装包的方式安装 go 语言,即请不要直接下载下图所示的文件: 我们在下面的 Stable versions 后找到最新版本的 go,选择适合自己电脑系统与架构的压缩包。要选择 Archive 而不要选择 Installer。 .notice{padding:18px;line-height:24px;margin-bottom:24px;border-radius:4px;color:#444;background:#e7f2fa}.notice p:last-child{margin-bottom:0}.notice-title{margin:-18px -18px 12px;padding:4px 18px;border-radius:4px 4px 0 0;font-weight:700;color:#fff;background:#6ab0de}.notice.warning .notice-title{background:rgba(217,83,79,.9)}.notice.warning{background:#fae2e2}.notice.info .notice-title{background:#f0b37e}.notice.info{background:#fff2db}.notice.note .notice-title{background:#6ab0de}.notice.note{background:#e7f2fA}.notice.tip .notice-title{background:rgba(92,184,92,.8)}.notice.tip{background:#e6f9e6}.icon-notice{display:inline-flex;align-self:center;margin-right:8px}.icon-notice img,.icon-notice svg{height:1em;width:1em;fill:currentColor}.icon-notice img,.icon-notice.baseline svg{top:0.125em;position:relative} Tip 当然使用 msi 等一键安装包安装也是完全可以的,如果你想要使用一键安装包的方式安装 go,请查阅其他资料。 如果你想要通过源码安装,请自行查阅 通过源码构建。 安装 & 配置 下面分别具体说明不同平台下安装和配置的方法。 Linux 解压压缩文件 这里我们可以直接使用 官方安装指南 提供的指令来解压。 rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz 本指令会将 go 安装在 /usr/local/go 路径下,因此执行命令需要 root 权限。当然,如果想要将 go 安装在其他路径也是可以的,但是还是推荐安装在官方推荐的路径下。...

August 24, 2021 · Aimer Neige

这不是 Bug,而是语言特性

今天遇到一个奇怪的问题: 一个 C 语言初学者写了这样的错误代码: switch (a) { case1: // do something break; case2: // do something break; case3: // do something break; default: break; } 错误很容易解决,但是,在编译这样的程序时,编译器居然没有报错??!! 那么 case1 case2 这些东西是哪里来的? 几番求证无果,最后在翻阅《C 专家编程》这本书的时候突然发现了原因: 首先像下面这样写是可以的: switch (i) { case 5 + 3: do_again: case 2: printf("I loop unremittingly\n"); goto do_again; default: i++; case 3: ; } 这里定义了一个标签 do_again,并且通过 goto 跳转。 原错误代码中 case1 case2 等被编译器理解为了标签。 由于 goto 不被建议使用,博主居然已经忘记了标签和 goto 的用法。...

November 5, 2020 · Aimer Neige

C 函数指针

函数指针在大型的 C 语言项目中十分重要,但是学校对它的介绍一带而过,国内一些介绍函数指针的文章十分粗浅甚至存在错误(这里就不点名了),因此博主写了这篇文章介绍函数指针,希望能够帮助一些 C 语言学习者。 文章部分内容翻译引用于 https://www.geeksforgeeks.org/function-pointer-in-c/ 函数指针的概念 类似变量,函数也会被分配一段存储空间,这段存储空间的首地址即被称做这个函数的地址。而且函数名表示的就是这个地址。既然是地址,我们就可以定义一个指针变量来存放,这个指针变量就叫做函数指针变量,简称函数指针。 函数指针的定义 下面的语句定义了一个指向函数的指针变量 p。其中 void *表示返回值,(*p) 表示 p 是一个指针变量, (int, float) 是函数的参数列表。 void *(*p) (int, float); 这样我们就得到了一个指针变量 p,它的类型为 void * (*)(int, float) 所以函数指针的定义方法为: 函数返回类型 (*指针变量名) (函数参数列表); 这里的函数参数列表类似函数声明,只需写出变量类型即可,并不需要定义变量。 即下面的俩种写法等价并且第二种写法中定义的变量并没有任何意义,建议使用第一种写法,不要使用第二种写法。 void *(*p) (int, float); void *(*p) (int a, float b); 如何对函数指针赋值 int Func(int x); // 函数的声明 int (*p) (int x); // 函数指针的定义 p = &Func; // 函数指针的赋值 p = Func; // 另一种可行的写法 注:对于俩种赋值写法的详细说明见对函数赋值和调用的一些说明...

November 4, 2020 · Aimer Neige

C 语言多线程基础

线程于进程的对比 thread 线程 有共享内存 process 进程 没有共享内存 gcc file.c -lpthread 创建线程 #include <stdio.h>#include <pthread.h> void *myfunc(void *args) { for (int i = 0; i < 50; i++) { printf("%d\n", i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, NULL); pthread_create(&th2, NULL, myfunc, NULL); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 传入参数...

November 1, 2020 · Aimer Neige

C 语言静态函数

在 C 语言中,函数默认是全局的。在函数前加“static”关键字可以使一个函数变成静态函数。例如,下面的函数 fun() 是静态的: static int fun(void) { printf("I am a static funciton.\n"); } 与 C 语言中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想要限制函数的访问时,我们可以将函数定义为静态的。另外,如果我们想要在其他文件中使用相同的函数名,我们也可以将函数定义为静态的。 例如,我们在文件 file.c 中存储了下面的程序: // in file `file1.c` #include <stdio.h> static void fun1() { printf("fun1 called.\n"); } 然后,我们在文件 file2.c 中存储了这样的程序: // in file `file2.c` #include <stdio.h> int main(void) { fun1(); return 0; } 接下来,如果我们按照如下的命令编译: gcc file2.c file1.c 你会得到这样的链接错误: undefined reference to `fun1' 这是因为 fun1() 函数在 file1.c 中被定义为静态,因而不能在 file2.c 中引用。

October 31, 2020 · Aimer Neige

GCC 基础

GCC 简介 GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc 、 g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar 、 nm 等。 GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C 、 Pascal 、 Fortran 、 Java 、 Ada 等语言均能进行编译。 GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86 、 ARM 、 PowerPC 、 mips 等,以及 Linux 、 Windows 等软件平台。 GCC 的 C 编译器 是 gcc,其命令格式为 : Usage: gcc [options] file... GCC 下默认文扩展名的含义: 文件扩展名 GCC 所理解的含义 *....

October 17, 2020 · Aimer Neige
nginx-logo

使用 Nginx 搭建静态网页服务

使用 Nginx 搭建静态网页服务本身是一件非常简单的事,但是我之前在 CSDN 找了几篇教程,弄了一下午也没弄好(不愧是屎山淘金),学了一段时间后端和 Linux 后,我大概只用了五分钟就弄好了,这里写一篇文章来帮助一下小白。 阅读须知 在阅读本文章前,你需要准备以下内容 掌握基础的 Linux 命令行操作 (本文章将介绍如何在 Linux 服务器上部署静态网页,需要进行终端操作,因此你必须掌握命令行的使用。如果你打算使用 Windows ,请查阅其他文章。) 拥有一台 Linux 服务器 (可以购买 VPS 也可以使用 虚拟机 本文章以 VPS 为例,并购置了域名 (域名非必须) ) 拥有一个静态网站的源码 (如果仅仅作为学习目的,你可以写一个简单的 HTML 文件,这里以使用 hexo 生成的静态网站为例。) 知道 Nginx 是什么,有什么用 (不需要掌握 Nginx) 不同 Linux 发行版下命令会有所区别,本文章以 Ubuntu20.04 为例 准备服务器 如果你已经有了一台服务器并安装好了 Nginx ,你可以直接跳过这一部分,但是如果你的服务器是新的,没有经过任何配置,请参阅以下内容进行配置。 升级系统 sudo apt update && sudo apt upgrade 安装 Nginx sudo apt install nginx 启动 Nginx sudo systemctl start nginx # 开机自动启动 sudo systemctl enable nginx 测试服务 直接在浏览器访问你服务器的 ip,如果你部署了 DNS 服务的话,你也可以直接使用域名。如果哦看到 Nginx 的欢迎界面,服务器准备成功!...

October 4, 2020 · Aimer Neige

每天一个 Python 小知识 isinstance

首先来看下 w3schools 的解释: Example Check if the number 5 is an integer: x = isinstance(5, int) Definition and Usage The isinstance() function returns True if the specified object is of the specified type, otherwise False. If the type parameter is a tuple, this function will return True if the object is one of the types in the tuple. Syntax isinstance(object, type) Parameter Values Parameter Description object Required....

May 29, 2020 · Aimer Neige