Потому, что функция InitEfaceType фактически возвращает структуру, а не указатель.
Структура не может быть nil. Если вы возвращаете указатель на структуру - тогда уже на nil можно проверить.
Сделайте fmt.Printf("Type: %T\n", InitEfaceType()) и вы увидите тип "main.S"
Чтобы иметь возможность проверить интерфейс на nil можете сделать вот так:
func InitEfaceType() interface{} {
var s *S
return s
}
...
fmt.Println(InitEfaceType() == (*S)(nil))
полный код
package main
import (
"fmt"
)
type S struct{}
func (s S) F() {}
func InitPointer() *S {
var s *S
return s
}
func InitEfaceType() interface{} {
var s *S
return s
}
func InitType() S {
var s S
return s
}
func main() {
fmt.Println(InitPointer() == nil)
fmt.Println(InitEfaceType() == (*S)(nil))
//fmt.Println(InitType() == nil)
}