package main import ( "fmt" "math" ) func main() { //method:method的概念,method是附属在一个给定的类型上的, //他的语法和函数的声明语法几乎一样,只是在func后面增加了一个receiver(也就是method所依从的主体)。 //method的语法如下: //func(r ReceiverType) funcName(parameters)(results) //虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样 //method里面可以访问接收者的字段 //调用method通过.访问,就像struct里面访问字段一样 /* rectangle := Rectangle{5.1, 6.5} fmt.Printf("The Rectangle's area is %f\n", rectangle.area()) circle := Circle{5.0} fmt.Printf("The Circle's area is %f\n", circle.area()) */ //method 可以定义在任何你自定义的类型、内置类型、struct等各种类型上面 //即以type定义的类型上面 //type ages int //type money float32 //type months map[string]int //指针作为receiver //如果一个method的receiver是*T,你可以在一个T类型的实例变量V上面调用这个method,而不需要&V去调用这个method //如果一个method的receiver是T,你可以在一个*T类型的变量P上面调用这个method,而不需要 *P去调用这个method /* box := Box{10, 20, 10, "white"} fmt.Printf("The Box's color is %s\n", box.color) //setColor接收的参数是指针类型,这里不需要使用*box来调用setColor()方法,go中会自动判断 box.setColor("Red") fmt.Printf("The Box's color is %s\n", box.color) */ //method的继承 //如果匿名字段实现了一个method,那么包含这个匿名字段的struct也能调用该method stu := student{Human{"yang", 26, "13883987410"}, "028110"} stu.sayHi() //method的继承 重写 emp := employee{Human{"alex", 27, "15920580257"}, "010"} emp.sayHi() } type Rectangle struct { width float32 length float32 } func (r Rectangle) area() float32 { return r.width * r.length } type Circle struct { r float64 } func (c Circle) area() float64 { return c.r * c.r * math.Pi } type Color string type Box struct { width, length, depth float32 color Color } //要改变box的颜色,需要用指针,而不是Box,传递这个Box的copy func (T *Box) setColor(c Color) { //下面两种方法都可以为Box修改颜色 T.color = c //go中不需要使用下面的方法来修改值,建议直接使用上面的方法调用 //*T.color = c } type Human struct { name string age int phone string } type student struct { Human schoolNum string } type employee struct { Human employeeNo string } func (h *Human) sayHi() { fmt.Printf("Hi,I'm %s,I'm %d years old and my phone number is %s\n", h.name, h.age, h.phone) } //employee重写Human的sayHi() func (e employee) sayHi() { fmt.Printf("Hi,I'm %s,I'm %d years old , my phone number is %s and my employee number is %s", e.Human.name, e.Human.age, e.Human.phone, e.employeeNo) }