I am planning on implementing a VM in Go. I saw tutorials where people designed their own type of assembly for their VM, but the Virtual Machine didn't execute the assembly code directly. They encoded each of the instructions for their VM assigning them each a number and forming a special bytecode for their machine. Is it better to interpret the bytecode or can you interpret the assembly code and achieve the same results?
If you want to use your VM in different guest platforms, then yes.
The advantage that bytecode gives you is portability (therefore the alternate naming "p-code", which is short for "portable code").
If you plan to use your VM in different platforms, you should go for bytecode. Then you would have to take care of compiling the program into bytecode instructions and the VM would take care of the rest.