美文网首页
16 Golang结构体详解(二)

16 Golang结构体详解(二)

作者: learninginto | 来源:发表于2021-03-26 18:55 被阅读0次
结构体方法和接受者

在go中,没有类的概念但是可以给类型(结构体、自定义类型)定义方法。所谓方法就是定义了接受者的函数。接受者的概念类似于其他语言中的this或self。

  • 方法的定义格式
func (接受者变量 接受者类型) 方法名(参数列表) (返回参数) {
    函数体
}
  • 结构体是值类型
type Person struct {
    name string
    age int 
    sex string
}
func main(){
    var p1 = Person {
        name:"哈哈",
        age:20,
        sex:"男",
    }
    p2 := p1
    fmt.Println(p1 == p2) // true
    p2.Name = "李四"
    fmt.Printf("%v %v", p2, p1) //{李四 20 男} {哈哈 20 男}
}
  • 接收者类型可以是指针类型和非指针类型
type Person struct {
    name string
    age int8
    sex string
    height int8
}

func (p Person) PrintInfo () {
    fmt.Printf("姓名:%v 年龄:%v\n", p.name, p.age)
}

//接收的结构体必须是结构体的指针,才能在内部修改其属性
func (p *Person) SetInfo (name string, age int8){
    p.name = name
    p.age = age
}

func main(){
    var p1 = Person{
        name:"张三",
        age:20,
        sex:"男",
    }
    p1.PrintInfo()
    //姓名:张三 年龄:20
    var p2 = Person{
        name:"李四",
        age:30,
        sex:"男",
    }
    p2.PrintInfo()
    //姓名:李四 年龄:30
    p1.PrintInfo()
    //姓名:张三 年龄:20
    
    p1.SetInfo("李四", 34)
    p1.PrintInfo()
    //姓名:李四 年龄:34

}
  • 给任意类型添加方法

在go中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法

type MyInt int

func (m MyInt) printInfo() {
    fmt.Println("我是自定义类型中的自定义方法")
}

func main() {
    var a MyInt = 20
    a.printInfo()
}
  • 结构体的匿名字段

结构体允许其成员字段在声明时没有字段名,而只有类型,这种没有名字的字段就称为匿名字段。因为将类型名作为字段名,所有要求匿名结构体的类型必须唯一。

type Person struct {
    string
    int
}

func main() {
    p := Person {
        "张三",
        20,
    }
    fmt.Println(p) //{张三 20}
}

结构体的字段类型可以是基本数据类型、切片、Map以及结构体

type Person struct {
    name string
    age int
    hobby []string
    map1 map[string]string
}

func main() {
    var p Person
    p.name = "张三"
    p.age = 20
    p.hobby = make([]string, 3, 6)
    p.hobby[0] = "吃饭"
    p.hobby[1] = "睡觉"
    p.hobby[2] = "打豆豆"
    p.map1 = make(map[string]string)
    p.map1["address"] = "北京"
    p.map1["phone"] = "139123123123"
    fmt.Printf("%#v\n", p)
    //main.Person{name:"张三", age:20, hobby:[]string{"吃饭", "睡觉", "打豆豆"}, map1:map[string]string{"address":"北京", "phone":"139123123123"}}
    fmt.Printf("%v", p.hobby)//[吃饭 睡觉 打豆豆]
}

%v前面加#代表输出结构体的所有实例

如果结构体的字段类型是指针、slice和map的零值都是nil,即未分配空间。如果需要使用这样的字段,需要先make才能使用

相关文章

  • 16 Golang结构体详解(二)

    结构体方法和接受者 在go中,没有类的概念但是可以给类型(结构体、自定义类型)定义方法。所谓方法就是定义了接受者的...

  • 15 Golang结构体详解(一)

    Golang中没有“类”的概念,Golang中的结构体struct和其他语言中的类有点相似。和其他面向对象语言中的...

  • 18 Golang结构体详解(四)

    结构体和Json相互转换 当Golang要为App或者小程序提供Api接口数据时,涉及到结构体和Json之间的相互...

  • 17 Golang结构体详解(三)

    一、结构体嵌套 demo1 嵌套匿名结构体 关于嵌套结构体的字段名冲突(就近原则) 当两个子结构同级、就近原则不法...

  • Learn Golang In Day 9

    Learn Golang In Day 9 简介 结构体是自定义的数据结构 定义结构体 package main ...

  • golang 结构体

     一个结构体类型可以包含若干个字段,也可以不包含任何字段。空结构体可以关联上一些方法,从而看成是函数的特殊版本。 ...

  • Golang:结构体

    结构体 结构体(struct)是用户自定义的类型,代表若干字段的集合。有时将多个数据看做一个整体要比单独使用这些数...

  • Golang结构体

    C++中结构体(struct)和类(class)的主要区别有: struct没有权限控制字段 struct没有方法...

  • golang结构体

    定义 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体的定义 结构体定义需要使用 type 和 ...

  • Golang 结构体

    继承

网友评论

      本文标题:16 Golang结构体详解(二)

      本文链接:https://www.haomeiwen.com/subject/wzkshltx.html