Golang struct结构

结构struct

  • Go中的struct与C中的struct很是类似,而且Go没有class,代替了class的位置,但并无代替class的功能
  • 使用type struct{} 定义结构,名称遵循可见性规则
  • 支持指向自身的指针类型成员
  • 支持匿名结构,可用做成员或定义成员变量
  • 匿名结构也能够用于map的值
  • 能够使用字面值对结构进行初始化
  • 容许直接经过指针来读写结构成员
  • 相同类型的成员可进行直接拷贝赋值
  • 支持==与!=比较运算符,但不支持>或<
  • 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  • 嵌入结构做为匿名字段看起来像继承,但不是继承
  • 能够使用匿名字段指针

结构的定义指针

package main

import (
    "fmt"
)

type Person struct { //结构也是一中类型
    Name string //定义struct的属性
    Age  int
}

func main() {
    a := Person{}
    a.Name = "joe" //对struct的属性进行操做,类型与class的使用方法
    a.Age = 19
    fmt.Println(a)
}

字面值初始化code

package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    a := Person{
        Name: "jack",
        Age:  19, //对结构的属性进行字面值的初始化
    }
    fmt.Println(a)
}

结构的传递继承

package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    a := Person{
        Name: "jack",
        Age:  19, //对结构的属性进行字面值的初始化
    }
    fmt.Println(a)
    A(a)
    fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per Person) {
    per.Age = 13
    fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A {jack 13}
{jack 19}
package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    a := Person{
        Name: "jack",
        Age:  19, //对结构的属性进行字面值的初始化
    }
    fmt.Println(a)
    A(&a)
    fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //经过一个指针进行传递,此时就不是值得拷贝了
    per.Age = 13
    fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A &{jack 13}
{jack 13}
package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    a := &Person{
        Name: "jack",
        Age:  19, //此时初始化的时候就将这个struct的指针取出来
    }
    //在进行struct的初始化的时候,就加上&取地址符号
    fmt.Println(a)
    A(a)
    B(a)
    fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //经过一个指针进行传递,此时就不是值得拷贝了
    per.Age = 13
    fmt.Println("A", per)
}
func B(per *Person) { //经过一个指针进行传递,此时就不是值得拷贝了
    per.Age = 15
    fmt.Println("B", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
&{jack 19}
A &{jack 13}
B &{jack 15}
&{jack 15}

匿名结构string

package main

import (
    "fmt"
)

func main() {
    a := &struct { //匿名结构,须要先对结构自己进行一个定义
        Name string
        Age  int
    }{
        Name: "jack",
        Age:  20,
    }
    fmt.Println(a)
}

匿名结构的嵌套it

package main

import (
    "fmt"
)

type Person struct {
    Name    string
    Age     int
    Contact struct {
        Phone, City string //匿名结构嵌套在Person中
    }
}

func main() {
    a := Person{Name: "Jack", Age: 20}
    a.Contact.Phone = "123321" //经过这种方法对嵌套在Person中的匿名结构进行字面值的初始化
    a.Contact.City = "BeiJing"
    fmt.Println(a)
}
PS G:\mygo\src\mytest> go run .\temp2.go
{Jack 20 {123321 BeiJing}}

匿名字段class

package main

import (
    "fmt"
)

type Person struct {
    string //匿名字段 在进行字面值初始化的时候 必须严格按照字段声明的顺序
    int
}

func main() {
    a := Person{"Jack", 20} //此时将string 和 int类型对调的时候就会报错
    fmt.Println(a)
}

结构相同类型的比较test

package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    a := Person{Name: "Jack", Age: 20}
    b := Person{Name: "Jack", Age: 20}

    fmt.Println(a == b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
true

嵌入结构import

package main

import (
    "fmt"
)

type human struct {
    Sex int
}
type teacher struct {
    human
    Name string
    Age  int
}
type student struct {
    human //这里的human也是一种类型,此时它至关于一种匿名字段,嵌入结构做为匿名字段的话
    //它本质上是将结构名称做为咱们的字段名称
    Name string
    Age  int
}

func main() {
    a := teacher{Name: "Jack", Age: 20, human: human{Sex: 0}} //所以咱们须要在这里进行这种初始化
    b := student{Name: "Tom", Age: 19, human: human{Sex: 1}}
    a.Name = "Fack"
    a.Age = 13
    a.human.Sex = 100 //保留这种调用的方法,是由于会涉及到名称的冲突
    //a.Sex = 101 这种写法也是能够的
    fmt.Println(a, b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
{{100} Fack 13} {{1} Tom 19}
相关文章
相关标签/搜索