There are also some other 'gotya's! The software that converts a STL file to G-code, customised for a specific printer, material and quality settings, is called a Slicer. Unfortunately, tuning slicer settings to exactly match your 3D printer's capabilities is *DIFFICULT*, especially when you need good dimensional accuracy for small features. e.g. extruding plastic on a FDM printer round a small circle for the inner perimeter of a hole feature tends to result in the plastic pulling radially inwards a bit initially and more shrinkage as it cools, resulting in a somewhat smaller hole than could be expected from the G-code path, nozzle height and extrusion rate. A *GOOD* slicer, properly tuned, will know the expected shrinkage for a range of hole sizes, materials and other printing conditions, so will compensate the toolpath accordingly. A decent slicer has some sort of hole size compensation, but it tends to be 'one size fits all' so may need to be tweaked per job. A less good slicer may not have any hole size compensation, and early slicers rarely had this feature.
This means that where fit is important there is a culture of tweaking hole sizes in the model, to compensate for the inaccuracies of the slicer, and unless you print on exactly the same model printer, at the same ambient temperature with exactly the same type of filament, the tweaked hole size is likely to be *wrong*. Send such a STL file out to a 3D printing service, and their better tuned pro-grade slicer will most likely print the STL far more accurately than you can, leaving you with oversize small holes and a sloppy fit for any part in them.
There are also issues with overhangs - you cant deposit molten plastic unsupported in free space and expect it to stay anywhere near where the nozzle put it. Therefore each perimeter extrusion path must be at least partially* over the one underneath, i.e. you cant have the underside of anything parallel to the bed. The shallowest angle underside that can be printed with acceptable quality varies with many factors, some of which are printer dependent, some material dependent, and some on user chosen print settings. If the overhang angle is shallower than the target printer and settings can do, either it wont print successfully, or the quality will be inferior.
The rules for non-FDM 3D printers are different, but they still have various constraints that force you to design for manufacturability.
This means that pre-sliced G-code is essentially useless unless you have exactly the same printer and filament, and pre-rendered STL only 3D models often give poor or unusable results for parts that need to fit together or to other non-3D printed parts.
* There are workarounds - the design may make use of bridging, where the printer can deliberately underextrude to stretch the extrusion straight across a small gap, but that only works if there is enough area either side of the gap to anchor the extrusion without distortion and gives poorer surface quality as the layer that did the bridging will have individual slightly sagging extrusions over the gap that don't coalesce to form a uniform surface. You can also tell a slicer to use support material, which makes it build a structure to provide a surface under the overhang to print on, that can be manually removed from the competed print as a post-processing step. Unfortunately, to make the supports easy (or even possible) to remove, unless a special dissolvable support material is used in a printer with at least two extruders, there cant be 100% contact between the support material and the overhang, so surface quality is always to some degree compromised. Also, removing support material from interiors, especially small holes, can be a royal PITA.