方法:面向对象的味道
go代码:
            package main
import (
    "fmt"
    "math"
)
type Rectangle struct{
    width,height float64
    rarea float64
}
type Circle struct{
    radius float64
}
func (r Rectangle) area() float64{
    return r.width * r.height
}
func (c Circle) area() float64{
    return c.radius * c.radius *math.Pi
}
func (r *Rectangle) setarea(a float64) {
    r.rarea = a
}
func (r Rectangle) setarea2(a float64) (Rectangle){
    r.rarea = a
    return r
}
func main(){
    r1 :=Rectangle{12,2,0}
    r1.setarea(r1.area())
    fmt.Println(r1.rarea)
    r2 := Rectangle{3,4,0}
    newr2 := r2.setarea2(r2.area())
    fmt.Println(r2.rarea)
    fmt.Println(newr2.rarea)
    c1 := Circle{10}
    c2 := Circle{2}
    fmt.Println("r1:",r1.area())
    fmt.Println(r2.area())
    fmt.Println(c1.area())
    fmt.Println(c2.area())
}
结果:
D:\code>go run 7.go
24
0
12
r1: 24
12
314.1592653589793
12.566370614359172
代码中有两个同名方法area,他们前面括号里是ReceiverType,称作receiver。
拥有不同receiver的方法是不同的,即使他们有相同的名字。
内建类型不能定义方法,但是可以定义一个有方法的这种类型。如:
type ages int
setarea()修改了字段rarea的值,比较setarea()和setarea2(),会发现如果不使用指针,赋值操作是给了一个复制版的r,
并不是原来的值。
匿名字段代码:
package main
import "fmt"
type Human struct{
    name string
    age int
    phone string
}
type Employee struct{
    Human//Human类型的匿名字段
    speciality string
    phone string
}
func main(){
    Bob := Employee{Human{"bob",34,"777777-3"},"designer","33-22"}
    fmt.Println(Bob.name)
    fmt.Println(Bob.phone)
    fmt.Println(Bob.Human.phone)
    fmt.Println(Bob.Human.name)
}
运行结果:
D:\code>go run 8.go
bob
33-22
777777-3
bob
从程序中,当有字段冲突时,我们必须写全字段名称;当没有冲突时,两种方式都可以。
            
              
              
              
              上一篇: 下载视频的工具网站
              
              
              下一篇: golang学习笔记-接口
              
            
0 Responses so far.