private GoFuncData getNextClosureFuncRef(Address startAddr, boolean isMethodWrapper,
				int maxRange) {
			if (!startAddr.isMemoryAddress()) {
				return null;
			}
			// Returns the function that is being used as the destination of a closure struct{}.F
			// This works off of a pattern of references (no decompilation pcode needed)
			// 1) Refs to closure struct { } rtti type
			// 2) ref is followed by call to runtime.newobject
			// 3) the new closure struct{}.F returned by newobject() is initialized with
			// address of a closure function (as determined by the name of the func: foo.func1)
			// The above steps are matched by the pattern of references, not by pcode or value 
			// propagation.
			Address maxAddr = startAddr.add(maxRange);
			for (Address refAddr : refMgr.getReferenceSourceIterator(startAddr, true)) {
				if (refAddr.compareTo(maxAddr) > 0) {
					break;
				}
				for (Reference ref : refMgr.getReferencesFrom(refAddr)) {
					if (ref.getReferenceType().isData()) {
						Address destAddr = ref.getToAddress();
						GoFuncData funcData = goBinary.getFunctionData(destAddr);
						GoSymbolName funcName = funcData != null ? funcData.getSymbolName() : null;
						if (funcName == null) {
							continue;
						}
						GoSymbolNameType nameType = funcName.getNameType();
						if (isMethodWrapper && nameType == GoSymbolNameType.METHOD_WRAPPER) {
							return funcData;
						}
						if (!isMethodWrapper && nameType != null && nameType.isClosure()) {
							return funcData;
						}
					}
				}
			}
			return null;
		}
Partially fixup closure func signatures by matching a closure func (*.func1) with a
closure struct ( struct { F uintptr; X0 blah... } ), and giving the func a context param
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/GolangSymbolAnalyzer.java