Golang的struct

  golang中的结构体(struct)和其他面向对象语言中的class一样,虽然不支持继承,但是支持组合。

声明结构体

package main
import "fmt"
type Person struct {
	Name string
	Age  int
}
func main() {
	p1 := Person{"abc", 30}
	fmt.Println(p1)

	p2 := Person{Name: "xyz", Age: 40}
	fmt.Println(p2)

	p3 := Person{}
	p3.Name = "golang"
	p3.Age = 8
	fmt.Println(p3)
}

  注意:结构体中成员属性的顺序很重要,即使两个结构体成员属性相同,但是顺序不同,那么这个两个结构体不相同。

嵌套结构体

  匿名嵌套

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}
type Student struct {
	Person
	Major string
}

func main() {
	s1 := Student{Person{"demo", 99}, "php"}
	fmt.Println(s1)

	s2 := Student{}
	s2.Person.Name = "test"
	s2.Person.Age = 88
	s2.Major = "Java"
	fmt.Println(s2)

	s3 := Student{}
	s3.Name = "hello"
	s3.Age = 77
	s3.Major = "C#"
	fmt.Println(s3)

	p1 := Person{"world", 66}
	s4 := Student{p1, "JS"}
	fmt.Println(s4)
}

    

  非匿名嵌套

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}
type Student struct {
	per   Person
	Major string
}

func main() {
	s1 := Student{Person{"demo", 99}, "php"}
	fmt.Println(s1)

	s2 := Student{}
	s2.per.Name = "test"
	s2.per.Age = 88
	s2.Major = "Java"
	fmt.Println(s2)
	/*
		//错误
		s3 := Student{}
		s3.Name = "hello"
		s3.Age = 77
		s3.Major = "C#"
		fmt.Println(s3)
	*/
	p1 := Person{"world", 66}
	s4 := Student{p1, "JS"}
	fmt.Println(s4)

}

  

  匿名组合-重名问题

package main

import "fmt"

type demo1 struct {
	Name string
}

type demo2 struct {
	Name string
}

type Demo struct {
	demo1
	demo2
}

func main() {
	/*
	注释掉的内容是错误方法
	dd := Demo{"abc", "xyz"}//两个成员都是结构体,当然不能用字符串赋值了,应该使用结构体
	dd := Demo{{"abc"}, {"xyz"}}
	dd := Demo{demo1: {"abc"}, demo2: {"xyz"}}
	*/
	dd1 := Demo{demo1{"abc"}, demo2{"xyz"}}
	fmt.Println(dd1)

	dd2 := Demo{}
	dd2.demo1.Name = "abc"
	dd2.demo2.Name = "xyz"
	fmt.Println(dd2)
}

    

匿名结构体

package main

import "fmt"

func main() {
	test := struct {
		Name string
		Age  int
	}{
		"abc",
		99,
	}
	fmt.Println(test) //{abc 99}
}

  

结构体进行比较

  比较的前提:结构体内部的各成员属性是可比较的,必须是同一个struct类型(不是说内部属性以及属性顺序相同就行,必须要是同一个结构体类型)。

  可以比较的情况

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{"abc", 99}
	p2 := Person{"xyz", 88}
	fmt.Println(p1 == p2)  //false,可以比较
}

  

  不可比较的情况

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

type ManKind struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{"abc", 99}
	m1 := ManKind{"xyz", 88}
	fmt.Println(p1 == m1) //运行错误
}

  

posted @ 2018-05-21 11:38  寻觅beyond  阅读(638)  评论(0编辑  收藏  举报
返回顶部