Это не деление с остатком, это целочисленное деление.
Если делишь одно целое число на другое целое число, работает целочисленная арифметика, потому что го это строго статически типизированный язык.
Чтобы получить дробное число, нужно явно делить одно число с плавающей точкой на другое.
package main
import "fmt"
func main() {
var some = float64(5) / float64(3)
fmt.Println(some)
fmt.Printf("%T", some)
}
Происходит это потому что компьютер так работает на уровне железа. Если процессору дать команду на деление двух целых, ответом будет целое. Если дать команду на деление двух флоатов — будет флоат.
В некоторых языках компилятор или интерпретатор берут на себя смелость решать за пользователя, какой ему тип нужен и автоматически включают нужный тип деления в зависимости от ситуации (обычно включается флоат на флоат, как в JS, например). Но это может приводить к ошибкам в некоторых ситуациях.
Поэтому в го, C, C++ и еще многих других языках (обычно это статически типизированные языки), пользователь должен явно выбирать требуемый тип деления, используя нужные типы переменных.