Как найти поля структуры, которые не назначены в golang? - PullRequest
0 голосов
/ 02 ноября 2018
type Student struct{
    Name string
    No int
}

student:=Student{
    Name:"Lily",
}

Итак, как я могу узнать, что поле ученика "Нет" не назначено?

Ответы [ 5 ]

0 голосов
/ 06 ноября 2018

Вы должны определить переменную как переменную-указатель

type Student struct{
    Name string
    No *int
}

student:=Student{
    Name:"Lily",
}

В этом случае, если вы делаете

if student.No==nil{
    fmt.Println("Yes I'm unassigned")
}

напечатает

Yes I'm unassigned

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

*student.NO 
0 голосов
/ 02 ноября 2018

Если вы определите No как целое число, то, если оно не назначено, golang установит для него значение 0 (значение по умолчанию), что иногда может сбивать с толку в зависимости от цели, которую вы используете (например, если 0 является допустимым значением для No).

Если вы действительно хотите проверить, назначен Student.No или нет. Я думаю, что лучше всего использовать Указатель .

type Student struct{
    Name string
    No *int
}

student:= Student{
    Name:"Lily",
}

if student.No == nil {
    fmt.Println("student.No is not defined")
}

student2 := Student{
    Name: "Bob",
    No: func(i int) *int{ return &i}(5),
}

if student2.No != nil {
    fmt.Printf("student.No is %d\n", *student2.No)
}

Вот код: https://play.golang.org/p/_lhbQcDA_eb

0 голосов
/ 02 ноября 2018

Каждый тип данных в Go имеет свое собственное «нулевое значение». Так, в случае No (number) это 0. Вы можете проверить, является ли значение No 0.

Подробнее здесь -> https://tour.golang.org/basics/12

0 голосов
/ 02 ноября 2018

Нет другого способа проверить, установлено ли какое-либо значение или нет, не сравнивая вручную каждое поле структуры.

Именно поэтому в stdlib во многих пакетах есть методы New....

Например, bufio.NewWriter(), где автор пакета позаботится об инициализации структуры с некоторыми нормальными значениями по умолчанию в соответствии с собственным вариантом использования.

// NewStudent returns new Student instance
func NewStudent() *Student {
    return &Student{Name: "defaultName", No: 7}
}

Даже если тип Student экспортирован, предполагается, что пользователи вашего пакета должны использовать New... для использования любой структуры.

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

0 голосов
/ 02 ноября 2018

Это поле будет иметь нулевое значение для этого типа данных. В этом случае 0. Ваш чек будет выглядеть так:

student.No == 0

Поначалу это может показаться немного странным. Но в этом случае 0 как число не имеет смысла как действительный номер студента.

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