美文网首页
提升Go的字段和方法

提升Go的字段和方法

作者: zzWinD | 来源:发表于2018-04-16 22:15 被阅读58次

原文

结构是一个包含很多字段名字和类型的集合。通常它是这样的:

package main
import "fmt"
type Person struct {
    name string
    age int32
}
func main() {
    person := Person{name: "Michał", age: 29}
    fmt.Println(person)  // {Michał 29}
}

(在本文章的其余部分,包名,导入,和主函数都会省略掉,不写咯)
上面的结构的每一个字段都有各自的名字。Go也允许跳过字段名字。字段没有名字叫做匿名或者嵌入。类型的名字(没有当前包的前缀)会被当作字段的名字。由于结构的字段名称必须唯一,所以我们不能这样做:

import (
    "net/http"
)
type Request struct{}
type T struct {
    http.Request // field name is "Request"
    Request // field name is "Request"
}

这样编译器会抛出错误:

> go install github.com/mlowicki/sandbox
# github.com/mlowicki/sandbox
src/github.com/mlowicki/sandbox/sandbox.go:34: duplicate field Request

结构内匿名字段的方法和字段可以很简单的访问到:

type Person struct {
    name string
    age int32
}
func (p Person) IsAdult() bool {
    return p.age >= 18
}
type Employee struct {
    position string
}
func (e Employee) IsManager() bool {
    return e.position == "manager"
}
type Record struct {
    Person
    Employee
}
...
record := Record{}
record.name = "Michał"
record.age = 29
record.position = "software engineer"
fmt.Println(record) // {{Michał 29} {software engineer}}
fmt.Println(record.name) // Michał
fmt.Println(record.age) // 29
fmt.Println(record.position) // software engineer
fmt.Println(record.IsAdult()) // true
fmt.Println(record.IsManager()) // false

匿名(嵌入)字段的方法和字段叫做提升。它们看上去像普通字段,但是它们不能通过结构初始化:

//record := Record{}
record := Record{name: "Michał", age: 29}

编译器会抛出错误:

> go install github.com/mlowicki/sandbox
# github.com/mlowicki/sandbox
src/github.com/mlowicki/sandbox/sandbox.go:34: duplicate field Request

如果要声明的话,就必须创建整个匿名(嵌入)字段结构:

Record{Person{name: "Michał", age: 29}, Employee{position: "Software Engineer"}}

相关文章

  • 提升Go的字段和方法

    原文 结构是一个包含很多字段名字和类型的集合。通常它是这样的: (在本文章的其余部分,包名,导入,和主函数都会省略...

  • 第04天(面对对象编程)_02

    05_结构体指针类型匿名字段.go 06_面向过程和对象函数的区别.go 07_为结构体类型添加方法.go 08_...

  • Go基础编程---面向对象

    面向对象 Go中没有发封装、继承、多态,但是可以通过方法、匿名字段、接口实现,Go中偏向于面向接口编程 匿名字段(...

  • 第04天(面对对象编程)_01

    01_匿名字段初始化.go 02_成员的操作.go 03_同名字段.go 04_非结构体匿名字段.go

  • <>

    结构体及其使用方法 结构体的定义 Go语言用嵌入式字段实现了继承吗?? GO语言不存在所谓的继承,只有组合。组合和...

  • 【Golang 基础】Go 语言的接口

    Go 语言中的接口   Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,没有数据字段。 只要某个类型...

  • Go语言基础04——面向对象编程(匿名字段、方法、接口)

    文章概述 匿名字段 方法 接口 对于面向对象编程的支持Go 语言设计得非常简洁而优雅。因为, Go语言并没有沿袭传...

  • 字段和方法

    现在,你知道了如何通过JNI来访问JVM中的基本类型数据和字符串、数组这样的引用类型数据,下一步就是学习怎么样和J...

  • 第04天(面对对象编程)_03

    11_方法的继承.go 12_方法的重写.go 13_方法值.go 14_方法表达式.go 15_接口的定义和实现.go

  • Golang 学习有感

    go+gin+sqlserver2012遇到的问题 空字段

网友评论

      本文标题:提升Go的字段和方法

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