美文网首页
go 面向对象(方法)

go 面向对象(方法)

作者: StevenQin | 来源:发表于2019-04-12 15:25 被阅读0次

基本介绍

  • 在某些情况下,我们需要声明(定义)方法。比如Person结构体:除了有一些字段外(年龄姓名..),Person结构体还有一些行为比如:说话、跑步、学习做算术题。这时就要用方法才能完成

Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因些自定义类型都有方法而不仅仅是struct

方法的声明和调用

type A struct {
    Num int
}

func (a A) test() {
    fmt.Println(a.Num)
}

对上面语法的说明
1、func (a A)test( ){ } 表示A结构体有一方法,方法名为test
2、(a A)体现 test方法是和A类型绑定的
举例说明

//定义结构体
type Person struct {
    Name string
}

//给Person类型绑定一个test方法
func (p Person) test() {
    fmt.Println("test() name =", p.Name)
}

func main() {
    var p Person
    p.Name = "tom"
    p.test() //调用方法
}

对上面的总结说明:
1、test方法Person类型绑定
2、test方法只能通过Person类型变量调用,而不能直接调用,也不能使用其它类型的变量来调用。
3、func (p Person)test(){}中的p表示哪个Person变量调用,这个p就是它的副本,这点和函数传参非常相似。
4、p这个形参名是可以自定义的,不是固定的。

方法的快速入门

1、给Person结构体加一个speak方法,输出xxx是一个好人

//定义结构体
type Person struct {
    Name string
}

func (p Person) speak() {
    fmt.Println(p.Name, "是一个goodman~")
}

//给Person类型绑定一个test方法
func (p Person) test() {
    fmt.Println("test() name =", p.Name)
}

func main() {
    var p Person
    p.Name = "tom"
    p.test()  //调用方法
    p.speak() //调用speak方法
}

2、给Person结构体添加一个jisuan计算方法,可以计算从 1 + ... + 1000的结果

//定义结构体
type Person struct {
    Name string
}

//给Person绑定jisuan方法
func (p Person) jisuan() {
    res := 0
    for i := 1; i <= 1000; i++ {
        res += i
    }
    fmt.Println(p.Name, "计算的结果是:", res)
}

func main() {
    var p Person
    p.Name = "tom"
    p.jisuan() //调用speak方法
}

3、给Person结构体添加一个jisuan2计算方法,该方法可以接收一个数n,可以计算从 1 + ... + n的结果

//定义结构体
type Person struct {
    Name string
}

//给Person绑定jisuan方法
func (p Person) jisuan(n int) {
    res := 0
    for i := 1; i <= n; i++ {
        res += i
    }
    fmt.Println(p.Name, "计算的结果是:", res)
}

func main() {
    var p Person
    p.Name = "tom"
    p.jisuan(800) //调用speak方法
}

4、给Person结构体添加getSum方法,返回两个数的合

//定义结构体
type Person struct {
    Name string
}

//给Person绑定getSum方法
func (p Person) getSum(n1 int, n2 int) int {
    return n1 + n2
}

func main() {
    var p Person
    p.Name = "tom"
    res := p.getSum(14, 16) //调用getSum方法
    fmt.Println("res=", res)
}
  • 内存分析图



    说明
    1、在通过一个变量去调用方法时,其调用机制和函数一样
    2、不一样的地方是,变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝)

  • 案例:计算圆的面积

package main

import "fmt"

type Circle struct {
    radius float64
}
func (c Circle) area()float64{
    return 3.14 * c.radius * c.radius
}
func main() {
    var c Circle
    c.radius = 4.0
    res := c.area()
    fmt.Println("面积是=",res)
}

内存图例


当area栈return后,area栈会销毁了,main栈执行完毕后,main栈也会销毁

  • 通常值拷贝,效率会低一点。优化的方案是,用指针(做地址拷贝,直接指向main栈)
func (c *Circle) area()float64{
    return 3.14 * c.radius * c.radius
}

相关文章

  • golang faq 精选

    go 是面向对象语言吗? 是也不是说是 因为 go 有 类型和方法 支持面向对象的方式编程。说不是 因为go没有...

  • go 面向对象(方法)

    基本介绍 在某些情况下,我们需要声明(定义)方法。比如Person结构体:除了有一些字段外(年龄,姓名..),Pe...

  • struct

    面向对象编程 Go支持面向对象编程特性,但和传统面向对象编程是有区别的,Go并不是纯粹的面向对象语言。 Go没有类...

  • Go基础语法(十二)

    面向对象编程 Go 并不是完全面向对象的编程语言。 Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘录如...

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

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

  • 第13章-OOP面向对象编程

    面向对象(OOP) go并不是一个纯面向对象的编程语言。在go中的面向对象,结构体替换了类。 Go并没有提供类cl...

  • Golang(十三) OOP面向对象编程

    面向对象(OOP) go并不是一个纯面向对象的编程语言。在go中的面向对象,结构体替换了类。 Go并没有提供类cl...

  • 第十六章:Go语言面向对象编程

    1. GO语言OOP概述 Go语言不是纯粹的面向对象的语言,准确是描述是,Go语言支持面向对象编程的特性.Go语言...

  • go面向对象的理解

    在go语言中没有面向对象的概念,但是可以通过下面方式实现面向对象的特征 封装, 通过方法实现 继承, 通过匿名字段...

  • 26. 结构体取代类

    26. 结构体取代类 Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面...

网友评论

      本文标题:go 面向对象(方法)

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