public void init(TaskMonitor monitor) throws IOException {
		this.voidPtrDT = dtm.getPointer(VoidDataType.dataType);
		this.uintptrDT = goBinary.getTypeOrDefault("uintptr", DataType.class,
			AbstractIntegerDataType.getUnsignedDataType(goBinary.getPtrSize(), dtm));
		this.uintDT = goBinary.getTypeOrDefault("uint", DataType.class,
			AbstractIntegerDataType.getUnsignedDataType(dtm.getDataOrganization().getIntegerSize(),
				dtm));
		this.int32DT = goBinary.getTypeOrDefault("int32", DataType.class,
			AbstractIntegerDataType.getSignedDataType(4, null));
		this.uint32DT = goBinary.getTypeOrDefault("uint32", DataType.class,
			AbstractIntegerDataType.getUnsignedDataType(4, null));
		this.uint8DT = goBinary.getTypeOrDefault("uint8", DataType.class,
			AbstractIntegerDataType.getUnsignedDataType(1, null));

		this.genericDictDT = dtm.getPointer(dtm.getPointer(uintptrDT));

		UnknownProgressWrappingTaskMonitor upwtm = new UnknownProgressWrappingTaskMonitor(monitor);
	
		typeOffsetIndex.clear();
		typeNameIndex.clear();
	
		Set<Long> discoveredTypes = new HashSet<>();
	
		for (GoModuledata module : goBinary.getModules()) {
	
			upwtm.initialize(0, "Iterating Golang RTTI types");
			for (Address typeAddr : module.getTypeList()) {
				if (upwtm.isCancelled()) {
					throw new IOException("Failed to init type info: cancelled");
				}
				upwtm.setProgress(discoveredTypes.size());

				GoType goType = getTypeUnchecked(typeAddr);
				if (goType != null) {
					goType.discoverGoTypes(discoveredTypes);
				}
				else {
					Msg.warn(this, "Failed to read type at " + typeAddr);
				}
			}
	
			upwtm.initialize(0, "Iterating Golang Interfaces");
			for (GoItab itab : module.getItabs()) {
				if (upwtm.isCancelled()) {
					throw new IOException("Failed to init type info: cancelled");
				}
				upwtm.setProgress(discoveredTypes.size());
	
				TypeRec rec = getTypeRec(itab.getType());
				if (rec.interfaces == null) {
					rec.interfaces = new ArrayList<>();
				}
				rec.interfaces.add(itab);
				TypeRec ifaceRec = getTypeRec(itab.getInterfaceType());
				if (ifaceRec.interfaces == null) {
					ifaceRec.interfaces = new ArrayList<>();
				}
				ifaceRec.interfaces.add(itab);

				itab.discoverGoTypes(discoveredTypes);
			}

			findUnindexedClosureStructTypes(monitor);
		}
		Msg.info(this, "Found %d golang types".formatted(typeOffsetIndex.size()));
	
		// these structure types are what golang map and chan types actually point to.
		mapGoType = findGoType("runtime.hmap"); // used when recovering a map[] type
		mapArgGoType = findGoType("*runtime.hmap", "uintptr"); // used when passing an unknown map[] type

		chanGoType = findGoType("runtime.hchan"); // used when recovering a chan type
		chanArgGoType = findGoType("*runtime.hchan", "uintptr"); // used when passing an unknown chan type
	}
Discovers available golang types

@param monitor {@link TaskMonitor}
@throws IOException if error reading data or cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/GoTypeManager.java