Как найти строковые поля, которые не назначены в golang?

113
12

type Student struct{
Name string
No int
}

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

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

спросил(а) 2018-11-02T10:02:00+03:00 1 год, 11 месяцев назад
1
Решение
58

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

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

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

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

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

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

ответил(а) 2018-11-02T10:46:00+03:00 1 год, 11 месяцев назад
90

Если вы определите No как целое число, то, если оно не назначено, Голанг установит его в 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

ответил(а) 2018-11-02T11:49:00+03:00 1 год, 11 месяцев назад
70

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

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 

ответил(а) 2018-11-06T09:54:00+03:00 1 год, 10 месяцев назад
69

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

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

ответил(а) 2018-11-02T10:06:00+03:00 1 год, 11 месяцев назад
69

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

student.No == 0

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

ответил(а) 2018-11-02T10:05:00+03:00 1 год, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема