方法:面向对象的味道
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.