@Override
	public boolean added(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log)
			throws CancelledException {
		long txId = program.getCurrentTransactionInfo().getID();
		if (txId == lastTxId) {
			// Only run once per analysis session - as denoted by being in the same transaction
			return true;
		}
		lastTxId = txId;

		if (isAlreadyAnalyzed(program)) {
			Msg.info(this, "Golang analysis already performed, skipping.");
			return false;
		}

		monitor.setMessage("Golang symbol analyzer");

		this.program = program;
		aam = AutoAnalysisManager.getAnalysisManager(program);

		goBinary = GoRttiMapper.getSharedGoBinary(program, monitor);
		if (goBinary == null) {
			Msg.error(this, "Golang symbol analyzer error: unable to get GoRttiMapper");
			return false;
		}

		goTypes = goBinary.getGoTypes();

		try {
			goBinary.initMethodInfoIfNeeded();

			markupSession = goBinary.createMarkupSession(monitor);
			GoModuledata firstModule = goBinary.getFirstModule();
			if (firstModule != null) {
				markupSession.labelStructure(firstModule, "firstmoduledata", null);
				markupSession.markup(firstModule, false);
			}

			for (GoType goType : goTypes.allTypes()) {
				// markup all gotype structs.  Most will already be markedup because they
				// were referenced from the firstModule struct
				markupSession.markup(goType, false);
			}

			markupWellknownSymbols();
			setupProgramContext();
			recoverDataTypes(monitor);
			markupGoFunctions(monitor);
			if (analyzerOptions.fixupDuffFunctions) {
				fixDuffFunctions();
			}
			if (analyzerOptions.fixupGcWriteBarrierFunctions) {
				fixGcWriteBarrierFunctions();
			}

			if (analyzerOptions.propagateRtti) {
				Msg.info(this,
					"Golang symbol analyzer: scheduling RTTI propagation after reference analysis");
				aam.schedule(new PropagateRttiBackgroundCommand(goBinary, markupSession),
					PROP_RTTI_PRIORITY.priority());
				Msg.info(this, "Golang symbol analyzer: scheduling closure function fixup");
				aam.schedule(new FixClosureFuncArgsBackgroundCommand(goBinary),
					FIX_CLOSURES_PRIORITY.priority());
			}
			if (analyzerOptions.fixupGcWriteBarrierFlag) {
				Msg.info(this, "Golang symbol analyzer: scheduling gcWriteBarrier flag fixup");
				aam.schedule(new FixGcWriteBarrierFlagBackgroundCommand(goBinary, markupSession),
					FIX_GCWRITEBARRIER_PRIORITY.priority());
			}

			if (analyzerOptions.createBootstrapDatatypeArchive) {
				createBootstrapGDT(monitor);
			}

			program.getOptions(Program.PROGRAM_INFO).setBoolean(ANALYZED_FLAG_OPTION_NAME, true);
			return true;
		}
		catch (IOException e) {
			Msg.error(this, "Golang analysis failure", e);
		}
		return false;
	}
Analyzes Golang binaries for RTTI and function symbol information by following references from
the root GoModuleData instance.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/GolangSymbolAnalyzer.java