美文网首页
第10章 2方法

第10章 2方法

作者: yezide | 来源:发表于2020-01-18 11:01 被阅读0次

1、方法定义

package main

import "fmt"

type TwoInts struct {
    a int
    b int
}

func main() {
    t1 := new(TwoInts)
    t1.a = 1;
    t1.b = 2;
    fmt.Printf("the sum is %d\n", t1.add())
}

// 这个add函数相当于是绑定到了TwoInts的实例t1上面了
// add方法名前面的是指定receiver
func (this *TwoInts) add() int {
    return this.a + this.b;
}
package main;

import "fmt";

type IntVector []int
type str = string
// 切片的例子
func (v IntVector) Sum() int {
    s := 0;
    for _, x := range v {
        s += x
    }
    return s
}

func main() {
    var iv = IntVector {1,2}
    fmt.Printf("test:%d\n", iv.Sum())
}

函数和方法的区别

函数将变量作为参数:Function1(recv)
方法在变量上被调用:recv.Method1()

2、方法的值传递 与 引用传递

package main;

import "fmt";

type Point1 struct {x int}

// 值传递, 在方法内改写x的值,rev引用不会被改变
// 如果写成 *Point1  就会同时改变rev的值
func (rev Point1) Sum() (rslt int) {
    rev.x = 2
    rslt = rev.x
    return rslt
}

func main() {
    
    var iv1 = new(Point1);
    fmt.Printf("sum:%d\n", iv1.Sum())
    fmt.Printf("iv1:%d\n", iv1.x)
}

6、go里面实现getter/setter

package main;

import "fmt";

type Person struct {
    fname string
    lname string
}

func (this *Person) FName() string {
    return this.fname;
}

func (this *Person) SetFName(fname string) {
    this.fname = fname
}

func main() {
    var p = new(Person);
    p.SetFName("jack ma");
    fmt.Println(p.FName())
}

3、继承访问父类方法/属性(内嵌)

package main

import "fmt"
import "math"

type Point struct {
    x, y float64
}

type NamePoint struct {
    Point
    name string
}

func (n *NamePoint) Abs() float64 {
    return n.Point.Abs()
}

func (this *Point) Abs() float64 {
    return math.Sqrt(this.x * this.x + this.y  * this.y)
}

func main() {
    // 这就相当于NamePoint是子类, Point是父类
    var n1 = &NamePoint {Point{2,3}, "pingfang"}
    fmt.Printf("NamePoint=%f\n", n1.Abs())

    var n2 = &Point {2,3};
    fmt.Printf("Point=%f\n", n2.Abs())
}

4、 多重继承

很简单,嵌入2个类型即可

package main

import "fmt"

type Camera struct{}

type Phone struct{}

func (camera *Camera) TakeAPicture() string {
    return "没有美颜的相机是没有灵魂的"
}

func (phone *Phone) MakeACall() string {
    return "13352011314"
}

type CameraPhpne struct{
    Camera
    Phone
}

func main() {
    cp := new (CameraPhpne)
    fmt.Printf("我是一个牛B的手机, 我能照像: %s\n", cp.TakeAPicture())
    fmt.Printf("我是一个牛B的手机, 我能打电话给女神: %s\n", cp.MakeACall())
}

5、重写String()方法自定义输出

package main

import "fmt" 
import "strconv"

type TwoInts struct {
    a int
    b int
}

func (this *TwoInts) String() string {
    return "(" + strconv.Itoa(this.a) + "/" + strconv.Itoa(this.b) + ")"
}

func main() {
    two1 := new(TwoInts)
    two1.a = 12
    two1.b = 10
    // 以下两个是等价的, 它会调用String()自定义输出
    fmt.Printf("two1 is: %v\n", two1)
    fmt.Println("two1 is:", two1)
    // %T输出 类型的定义
    fmt.Printf("two1 is: %T\n", two1)
    // %#v 我理解是最屌的, 定义、定义字段都会输出
    fmt.Printf("two1 is: %#v\n", two1)
}

相关文章

网友评论

      本文标题:第10章 2方法

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