美文网首页
Object-oriented

Object-oriented

作者: 曹小恒 | 来源:发表于2018-10-24 00:28 被阅读0次

Method belog to struct

package mainimport (    "fmt"    "math")type Rectangle struct{    width, height float64}type Circle struct {    radius float64}func (r Rectangle) area(){    return r.width*r.height}func (c Circle) area(){    return c.radius * c.radius * math.Pi}func main(){    r1 := Rectangle{12,2}    c1 := Circle{10}    fmt.Println("Area of r1 is: ",r1.area())}

Noted:

  • the name of methods can be the same, but if the struct receivers are different, then the methods are different

  • calling method by ., just like struct calling its elements.

[图片上传失败...(image-227a09-1540312119818)]

Not only struct, all other build-in types, self-defined types could be the object to apply methods.

Here are some examples of self-defined types:

type ages int //aliastype money float32type months map[string]int

Here is another comprehensive example:

package mainimport "fmt"const(    white = iota    black    blue    red    yellow)type Color byte    //uint8type Box struct{    width,height, depth float64    color Color}type BoxList []Box  //a slice whose elements are boxesfunc (b Box) Volume() float64{    return b.width * b.height * b.depth}func (b *Box) SetColor(c color){    b.color = c}func (bl BoxList) BiggestColor() Color{    v := 0.00    k := Color(white)    for _,b := range bl{    //_,b corresponding to index and value, b is the strcuts        if bv := b.Volume();bv>v{            v = bv            k = b.color        }    }    return k}func (bl BoxList) PaintItBlack(){    for i := range bl{    //here i is index, we skip the value, we can also write like this:    //fot _,b := range bl        bl[i].SetColor(black)    //b.SeetColor(black)    }}func (c Color) String() string{    strings := []string {"white","black","blue","red","yellow"}    return string[c]}

Use pointers as receiver

func (b *Box) SetColor(c color){    b.color = c}

Here we may use *b.color instead, cause the input is a pointer(the address), however golang knows what we want to do, so we do not need to take too much time specifying those troublesome issues.

Likely, we may also use &bl[i] since the receiver of SetColor is a pointer(address), but similarily, do not focus on those details.

func (bl BoxList) PaintItBlack(){    for i := range bl{    //here i is index, we skip the value, we can also write like this:    //fot _,b := range bl        bl[i].SetColor(black)    //b.SeetColor(black)    }}

Inherit

If the embeded segment realize some methods, then the struct who includes it can inherit those methods, too.

package mainimport "fmt"type Human struct{    name string    age int    phone string}type Student struct{    Human    school string}func (h *Human) Sayhi(){    fmt.Println("Hi, I am", h.name, "you can call me on ",h.phone)}func main(){    make := Student{Human{"Mark",25,"222-222"},"MIT"}    make.SayHi()}

Overwrite

package mainimport "fmt"type Human struct{    name string    age int    phone string}type Student struct{    Human    school string}func (h *Human) Sayhi(){    fmt.Println("Hi, I am", h.name, "you can call me on ",h.phone)}func (s *Student) Sayhi(){    fmt.Println("Hi, I am a student")}func main(){    make := Student{Human{"Mark",25,"222-222"},"MIT"}    make.SayHi()}

相关文章

网友评论

      本文标题:Object-oriented

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