type Person struct {
    ID int `json:"id"`
}

type PersonInfo []Person

type PersonInfo2 [] struct {
   ID int `json:"id"`
}

Есть ли разница между PersonInfo и PersonInfo2

3
Blue Joy 19 Окт 2017 в 06:35

3 ответа

Лучший ответ

Основное различие заключается в том, как вы должны инициализировать объекты Person вне инициализации PersonInfo / PersonInfo2. Поскольку PersonInfo2 является массивом анонимного структурного типа, мы ничего не знаем об этом типе за пределами инициализации PersonInfo2.

Таким образом, они оба могут быть инициализированы следующим образом:

m := PersonInfo{{1}, {2}}
n := PersonInfo2{{1},{2}}

Однако, если мы хотим добавить элемент типа анонимной структуры, нам нужно будет указать полный тип:

append(n, struct { ID int  `json:"id"` }{3})

Если мы распечатаем их, мы увидим, что они выглядят одинаково: fmt.Printf("%+v\n%+v", m, n) Выходы:

[{ID:1} {ID:2}]
[{ID:1} {ID:2}]

Однако они не будут глубоко равны, потому что PersonInfo - это массив типа Person, а PersonInfo2 - это массив анонимного структурного типа. Итак, следующее:

if !reflect.DeepEqual(m,n) {
    print("Not Equal")
}

Напечатает «Не равно».

Здесь есть ссылка, которую вы можете увидеть сами.

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

6
Jack Gore 20 Окт 2017 в 15:37

Go использует structural typing, то есть, если два типа имеют один и тот же базовый тип, они эквивалентны.

Итак, на ваш вопрос: Person и struct{ ID int 'json:"id"'} эквивалентны, поскольку они имеют один и тот же базовый тип, и, следовательно, PersonInfo и PersonInfo2 также эквивалентны. Я взял теги json, чтобы упростить пример.

person1 := Person{1}

pStruct1 := struct{ID int}{2}


pInfo1 := PersonInfo{
    person1,
    pStruct1,
}

pInfo2 := PersonInfo2{
    person1,
    pStruct1,
}


fmt.Printf("%+v\n", pInfo1)
fmt.Printf("%+v", pInfo2);

//outputs
//PersonInfo: [{ID:1} {ID:2}]
//PersonInfo2: [{ID:1} {ID:2}]

Пример кода: https://play.golang.org/p/_wlm_Yfdy2

1
sf9v 19 Окт 2017 в 04:04

type PersonInfo является объектом Person, тогда как PersonInfo2 является class (или type на Голанге) сам по себе. Хотя их структура данных похожа.

Поэтому, когда вы запустите DeepEqual () для проверки сходства, оно окажется ложным.

Пример по предыдущему комментарию:

if !reflect.DeepEqual(m,n) {
    print("Not Equal")
}

Надеюсь это поможет.

-1
Kingsley Tan 19 Окт 2017 в 08:22