Blue Poison

配置 go 开发环境

由于某些网络原因1,本文所提到的部分网站、下载链接可能在中国大陆地区无法访问,请自行查找解决方案,本文不再赘述。 如果你在阅读本文时遇到了任何问题,请查阅 go 语言官方网站。 下载预编译文件 在 Download Go 选择适合你平台的最新版本文件下载。 本文不推荐使用一键安装包的方式安装 go 语言,即请不要直接下载下图所示的文件: 我们在下面的 Stable versions 后找到最新版本的 go,选择适合自己电脑系统与架构的压缩包。要选择 Archive 而不要选择 Installer。 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 安装在其他路径也是可以的,但是还是推荐安装在官方推荐的路径下。 Info 如果你使用了其他的路径来安装 go,在之后的配置过程中记得要修改 GOROOT 变量修改为你所安装的路径。 执行命令前请先切换工作目录,确保当前路径下有刚刚下载好的压缩包。 Warning 压缩包名 go1.17.linux-amd64.tar.gz 可能有所不同,这取决于你安装的 go 版本和操作系统及处理器架构。 配置环境变量 成功解压后,如果你尝试直接在终端执行 go 指令,你会发现系统并没有识别到你刚安装的 go 二进制文件,这是因为我们还没有对 go 的环境变量进行配置。...

八月 24, 2021 · 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; // 另一种可行的写法 注:对于俩种赋值写法的详细说明见对函数赋值和调用的一些说明 函数指针的调用 #include <stdio....

十一月 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; } 传入参数 #include <stdio.h> #include <pthread.h> void *myfunc(void *args) { char *name = (char *)args; for (int i = 0; i < 50; i++) { printf("%s %d\n", name, i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, "th1"); pthread_create(&th2, NULL, myfunc, "th2"); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 分部计算...

十一月 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 中引用。

十月 31, 2020 · Aimer Neige

面向小白的 C 语言随机数详解

// 生成一系列0~9之间的随机整数 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand( time(NULL) ); int ret; for (int i = 0; i < 20; i++) { ret = rand() % 10; // ret是一个0~9之间的随机整数 printf("%d ", ret); } return 0; } 输出结果 7 6 6 1 6 9 2 7 1 8 2 0 5 9 2 5 4 0 0 0 这是啥啊?看不懂啊。 不要着急,我来慢慢讲 首先是一个最简单的随机数: #include <stdio.h> #include <stdlib.h> int main() { int ret = rand(); printf("%d", ret); return 0; } 输出结果...

一月 24, 2020 · Aimer Neige