impressive17
@impressive17

Почему одна функция возвращает true, а вторая false?

Почему функция InitPointer() возвращает true, а InitEfaceType() false и почему InitType() вообще не компилируется?
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() == nil)
	//fmt.Println(InitType() == nil)
}
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Потому, что функция 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)
}

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
почему InitType() вообще не компилируется?
возвращает тип структуры, а не указатель на нее.

InitPointer() возвращает true
Го инициализирует переменные, а потому для указателя - nil.

а InitEfaceType() false
потому что interface{} это не nil.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы