public static GoRttiMapper getGoBinary(Program program, TaskMonitor monitor)
			throws BootstrapInfoException, IOException {
		GoBuildInfo buildInfo = GoBuildInfo.fromProgram(program);
		if (buildInfo == null) {
			// probably not a golang binary
			return null;
		}

		GoVer goVer = buildInfo.getGoVer();
		if (goVer.isInvalid()) {
			throw new BootstrapInfoException(
				"Invalid Golang version string [%s]".formatted(buildInfo.getVersion()));
		}
		if (!SUPPORTED_VERSIONS.contains(goVer) ) {
			Msg.error(GoRttiMapper.class, "Untested golang version [%s]".formatted(goVer));
		}

		ResourceFile gdtFile =
			findGolangBootstrapGDT(goVer, buildInfo.getPointerSize(), buildInfo.getGOOS(program));
		if (gdtFile == null) {
			Msg.error(GoRttiMapper.class,
				"Missing golang gdt archive for golang version [%s]".formatted(goVer));
		}

		GoApiSnapshot apiSnapshot;
		try {
			apiSnapshot = GoApiSnapshot.get(goVer, buildInfo.getGOARCH(program),
				buildInfo.getGOOS(program), monitor);
			if (!apiSnapshot.getVer().isInvalid()) {
				Msg.info(GoRttiMapper.class,
					"Using golang api snapshot for version %s".formatted(apiSnapshot.getVer()));
			}
		}
		catch (CancelledException e) {
			throw new IOException("Error fetching Golang API snapshot file: cancelled");
		}

		return new GoRttiMapper(program, buildInfo, buildInfo.getPointerSize(), goVer, gdtFile,
			apiSnapshot);
	}
Creates a {@link GoRttiMapper} representing the specified program.

@param program {@link Program}
@param monitor {@link TaskMonitor}
@return new {@link GoRttiMapper}, or null if basic golang information is not found in the
binary
@throws BootstrapInfoException if it is a golang binary and has an unsupported or
unparseable version number or if there was a missing golang bootstrap .gdt file
@throws IOException if there was an error in the Ghidra golang rtti reading logic
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/GoRttiMapper.java