Как проверить пустую структуру, которая содержит только одно логическое поле - PullRequest
0 голосов
/ 16 марта 2019
type Test struct { }

Я знал, что это может быть способ проверить пустую структуру с помощью (Test{}) == test. Тем не менее, он не работает для структуры, которая содержит только одно логическое поле. Учитывая этот пример:

package main

import "fmt"

type Test struct {
  Foo bool
}

func main() {
  empty := Test{}
  test1 := Test{Foo: true}
  test2 := Test{Foo: false}
  fmt.Println(Test{} == test1) //False yay
  fmt.Println(Test{} == test2) //True oh no ...
  fmt.Println(Test{} == empty) //True yay
}

По сути, == думает, что структура, содержащая поле false, идентична пустой структуре.

Есть ли лучший способ проверить пустую структуру или я что-то здесь упускаю?

Кроме того, вы можете задаться вопросом, почему в структуре только одно поле, ну, поскольку структура находится в стадии разработки, в дальнейшем у нее может быть больше полей.

Ответы [ 2 ]

3 голосов
/ 16 марта 2019

Спецификация языка программирования Go

Типы структур

Структура - это последовательность именованных элементов, называемых полями, каждыйиз которых имеет имя и тип.Имена полей могут быть указаны явно

// An empty struct.
struct {}

Составные литералы

Составные литералы создают значения для структур, массивов, срезов и карт и создают новое значение каждый раз, когда ониоцениваются.Они состоят из типа литерала, за которым следует список элементов в скобках.Каждому элементу может предшествовать соответствующий ключ.

Литерал может опускать список элементов;такой литерал оценивается как нулевое значение для его типа.

Нулевое значение

Когда память выделяется для переменной, либо через объявление, либо через вызов newили когда создается новое значение с помощью составного литерала или вызова make, и явная инициализация не предоставляется, переменной или значению присваивается значение по умолчанию.Каждый элемент такой переменной или значения устанавливается в нулевое значение для его типа: false для логических значений, 0 для числовых типов, «» для строк и nil для указателей, функций, интерфейсов, слайсов, каналов и карт.Эта инициализация выполняется рекурсивно, поэтому, например, каждый элемент массива структур будет обнулять свои поля, если не указано значение.


type Test struct {
  Foo bool
}

empty := Test{}

empty не пусто.Это нулевое значение.

zeroValue := Test{}

или, явно,

zeroValue := Test{Foo: false}
0 голосов
/ 16 марта 2019

Структура Test всегда содержит логическое поле Foo.Он просто инициализируется на false, если вы не указали его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...