go的便捷之处在于可以申明匿名类型对象,当然C#也可以,但是go中匿名类型对象更方便,可以在字段上打标签,定义json序列化内容,更灵活。
本文测试环境:
- go1.19.3
- .Net Framework 4.7.2
go
go中具有相同字段的匿名对象是否是同一个类型?
答案:是同一个类型
package main
import (
"fmt"
"reflect"
)
func main() {
var p1 any = struct {
Name string
Age int
}{}
p2 := struct {
Name string
Age int
}{}
fmt.Println(reflect.TypeOf(p1) == reflect.TypeOf(p2))
}
运行结果:
go中具有相同字段的匿名对象,但是标签不同,是否是同一个类型?
答案:不是同一个类型
package main
import (
"fmt"
"reflect"
)
func main() {
p1 := struct {
Name string `json:"name"`
Age int
}{}
p2 := struct {
Name string
Age int
}{}
fmt.Println(reflect.TypeOf(p1) == reflect.TypeOf(p2))
}
运行结果:
go中的匿名类型和非匿名结构体具有相同的字段,是否属于同一个类型?
答案:不属于同一个类型
package main
import (
"fmt"
"reflect"
)
func main() {
p1 := struct {
Name string
Age int
}{}
p2 := Person{}
fmt.Println(reflect.TypeOf(p1) == reflect.TypeOf(p2))
}
type Person struct {
Name string
Age int
}
运行结果:
C#
c#中具有相同字段的匿名对象是否是同一个类型?
答案:是同一个类型
internal class Program
{
static void Main(string[] args)
{
var p1 = new
{
Name = "tony",
Age = 18
};
var p2 = new
{
Name = "tony",
Age = 18
};
Console.WriteLine(p1.GetType()==p2.GetType());
Console.Read();
}
}
输出结果:
c#中的匿名类型和非匿名结构体具有相同的字段,是否属于同一个类型?
答案:不属于同一个类型
internal class Program
{
static void Main(string[] args)
{
var p1 = new
{
Name = "tony",
Age = 18
};
var p2 = new Person()
{
Name = "tony",
Age = 18
};
Console.WriteLine(p1.GetType()==p2.GetType());
Console.Read();
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
运行结果:
由以上测试结果得出:
如果两个匿名对象的字段数量和类型是完全一样的,那么他们是同一个类型,这在go和C#中的表现是一致的