vm/util.go
func alignTypesForArithmetic(left, right interface{}) (reflect.Value, reflect.Value) {
	// These avoid crashes for accessing nil interfaces
	if left == nil {
		left = 0
	}
	if right == nil {
		right = 0
	}

	leftV := interfaceToNumeric(left)
	rightV := interfaceToNumeric(right)

	if leftV.Kind() == rightV.Kind() {
		return leftV, rightV
	}

	var alignTo reflect.Type
	if leftV.Kind() > rightV.Kind() {
		alignTo = leftV.Type()
	} else {
		alignTo = rightV.Type()
	}

	return leftV.Convert(alignTo), rightV.Convert(alignTo)
}
func alignTypesForArithmetic(left, right interface{}) (reflect.Value, reflect.Value) {
	// These avoid crashes for accessing nil interfaces
	if left == nil {
		left = 0
	}
	if right == nil {
		right = 0
	}

	leftV := interfaceToNumeric(left)
	rightV := interfaceToNumeric(right)

	if leftV.Kind() == rightV.Kind() {
		return leftV, rightV
	}

	var alignTo reflect.Type
	if leftV.Kind() > rightV.Kind() {
		alignTo = leftV.Type()
	} else {
		alignTo = rightV.Type()
	}

	return leftV.Convert(alignTo), rightV.Convert(alignTo)
}
// Given possibly non-matched pair of things to perform arithmetic
// operations on, align their types so that the given operation
// can be performed correctly.
// e.g. given int, float, we align them to float, float