A GCC front end turns code into an intermediate, internal form used by GCC. A GCC back end turns this intermediate, internal form into the final form that the compiler outputs.
So, for example, if you have a C++ front end and a Java front end, you can accept input in C++ and Java. If you have an x86 back end and a MIPS back end, you can produce executables for both x86 and MIPS CPUs.
If you wanted to add Go support to GCC, you'd write a Go front end for GCC. Then you could compile Go code for every platform GCC supports.
If you wanted to add support to GCC for a new CPU, you'd write a new back end for that CPU. Then you could produce code for that CPU using every language GCC supports.