本文讲述了go-judge的编译、实现过程和基本原理,搭建了基本的测评流程,包括读取本地测试样例,进行测评与测评结果的反馈。其中的打包的镜像、源代码都在文末加了下载链接。1.前言1.1 实现结果先看实现的结果:实现了(1)代码编译 (2)文件读取 (3)判题机输出 (4)输出对比1.2 go-judge简介go-judge 是一个用 Go 语言编写的高性能代码执行沙箱服务,专为在线评测系统(OJ)设计。它利用 Linux 内核的 cgroup 和 namespace 技术,安全隔离并运行用户提交的 C++、Python、Java 等多语言代码。go-judge 提供 RESTful API,支持编译、运行、文件缓存和资源限制,可通过 HTTP 或 WebSocket 调用。它既支持直接部署为二进制服务,也可作为 Docker 容器运行,是构建现代判题系统的核心组件。1.3 官网资源(1)官方源代码:https://github.com/criyle/go-judge上面的如果打不开,可以从下面链接下载:go-judge-master.zip链接:百度网盘:通过网盘分享的文件:go-judge-master.zip链接: https://pan.baidu.com/s/1A-9HFtA6AbgDojAcyxHwbA?pwd=bxh3 提取码: bxh3夸克网盘:我用夸克网盘给你分享了「go-judge-master.zip」,点击链接或复制整段内容,打开「夸克APP」即可获取。/0c8e3b4ft9😕链接:https://pan.quark.cn/s/04455d03d86f?pwd=cFcz提取码:cFcz(2)官方的中文文档:https://github.com/criyle/go-judge/blob/master/README.cn.md(3)go-judge文档:https://docs.goj.ac/cn/非常建议自己阅读几遍。(4)go-sandbox官网:https://github.com/criyle/go-sandboxgo-judge 是基于底层库 go-sandbox 构建的上层服务,go-sandbox 提供核心的 Linux 系统隔离能力,而 go-judge 将其封装成可直接调用的网络 API 服务。(5)go-judge-demo(官方基于go-judge实现的demo)https://github.com/criyle/go-judger-demo1.4 版本windows10go-judge:1.12.0docker:29.5.3node:22.19.02.实现原理首先将源代码,按照规定格式,送入go-judge,go-judge会返回一个fileId按照官方给的格式,fileId+题目的输入数据 再传入go-judge,go-judge会返回数据,这个数据包含标准输出(stdout)或(stderr)当拿到go-judge对于当前的 测试输入 的标准输出后,拿着这个结果和 测试输出 做比对,如果一致就认为是对的3.go-judge部署与实现这一小节的目的是让go-judge跑起来,实际选用的Docker方式3.1 服务器部署官方给了可执行文件可以按照你服务器的环境进行下载和编译。文件名适用环境说明go-judge-init_1.12.0_linux_38632 位 x86 架构(老旧 Intel/AMD 32 位 CPU)已逐渐淘汰,一般不建议使用go-judge-init_1.12.0_linux_amd64v264 位 x86_64 架构,支持 v2 指令集绝大多数现代 64 位 x86 服务器/PC 适用(兼容性最好,推荐首选)go-judge-init_1.12.0_linux_amd64v364 位 x86_64,支持 v3 指令集(约 2013 年后的 CPU)性能略优,但需要较新 CPU(如 Intel Haswell 及以上),兼容性稍窄go-judge-init_1.12.0_linux_arm6464 位 ARM 架构(如 AWS Graviton、Apple M 系列、树莓派 4 等)适用于 ARM 云服务器或嵌入式设备go-judge-init_1.12.0_linux_armv532 位 ARM 架构(旧版树莓派等)老旧 ARM 设备,较少使用go-judge-init_1.12.0_linux_armv732 位 ARM 架构(旧版树莓派等)老旧 ARM 设备,较少使用go-judge-init_1.12.0_linux_loong64龙芯(LoongArch)64 位架构国产龙芯 CPU 专用go-judge-init_1.12.0_linux_mips64le_hardfloatMIPS 64 位小端,硬浮点某些嵌入式或专用设备go-judge-init_1.12.0_linux_ppc64lePowerPC 64 位小端IBM POWER 系列服务器Source code (zip)/(tar.gz)源代码(不限平台)用于自行编译,不直接运行如果想要编译,还需要在服务器上装上一些语言的编译器等。本文主要演示Docker方式,后续会出文章详细解释服务器部署方式。3.2 Docker部署电脑要先安装Docker环境,这里又有三种情况。(1)虚拟机 (2)windows+wls2(ubuntu) (3)windows+docker desktop本文选用的是(3),因为没装虚拟机,第二种情况测试了很多时间,要不就是403,要不就是下载不下来,最终选了第3种。记住目的,我们只是需要docker安装go-judge而已,上面的方式都可以。官方推荐官方说可以使用下面的命令直接运行:dockerrun-it--privileged--shm-size=256m-p5050:5050 criyle/go-judge在windows环境下,试了很多次,还是不行,而且还需要增加编译器,所以更推荐自己构建Docker镜像。3.3 制作Docker镜像本文使用的windows desktop 4.78。官方下载地址:https://docs.docker.com/desktop/setup/install/windows-install/上面的如果打不开,或者下载不了,可以使用下面的备用链接:Docker Desktop Installer.exe链接:百度网盘:通过网盘分享的文件:Docker Desktop Installer.exe链接: https://pan.baidu.com/s/1YsAY-eiJCDCsJv4VN8PcMw?pwd=7grc 提取码: 7grc夸克网盘:我用夸克网盘给你分享了「Docker Desktop Installer.exe」,点击链接或复制整段内容,打开「夸克APP」即可获取。/649a3b4gsz😕链接:https://pan.quark.cn/s/486515d87f08?pwd=wLLH提取码:wLLH下载完后,安装。需要注意的是(1)开启 WSL2(推荐,Docker 默认后端)或 Hyper-V(2)安装时勾选 Add shortcut to desktop + 自动配置环境变量(默认勾选)安装完后,按win+R,后输入cmd,然后在cmd中输入docker -v然后,下载go-judge源代码。如果上面的打不开,可以使用备用链接:go-judge-1.12.0.zip链接:百度网盘:通过网盘分享的文件:go-judge-1.12.0.zip链接: https://pan.baidu.com/s/1A48NcXBbv4cA_gv3X4NzFQ?pwd=8gxh 提取码: 8gxh2.夸克网盘:我用夸克网盘给你分享了「go-judge-1.12.0.zip」,点击链接或复制整段内容,打开「夸克APP」即可获取。/47113b4hGw😕链接:https://pan.quark.cn/s/72994dd81f3d?pwd=SeKg提取码:SeKg下载后,解压。准备构建go-judge镜像。直接构建失败率挺高的,所以建议先安装go-lang和ubuntu (也可以安装debian,官方用的debian示例),再构建。按win+R,输入cmd,然后dockerpull golang:1.25等待它安装完,注意版本要适配,不然构建可能会报错这个过程根据网络情况可能会长短不一。然后安装ubuntudockerpull ubuntu:22.04编写DockerFile,把下面的内容复制,然后另存为DockerFile (注意,没有文件类型)# 编译阶段FROM golang:1.25 AS builder WORKDIR /build COPY..ENVGOPROXY=https://goproxy.cn,direct RUN go mod downloadCGO_ENABLED=0go build-ogo-judge ./cmd/go-judge# 运行阶段(只安装 C++ 编译器)FROM ubuntu:22.04 RUNsed-i's/archive.ubuntu.com/mirrors.aliyun.com/g'/etc/apt/sources.list\apt-getupdateapt-get