

- 案例
package main
import "fmt"
type Circle struct {
radius float64
}
//方法和结构体的指针类型绑定
func (c *Circle) area()float64{
//c的内容存的是地址
fmt.Printf("c 是 *Circle指向的地址 %p\n",c)
c.radius = 10
//因为 c是指针,因此我们标准的访问字段的方式是(*c).radius
//return 3.14 * (*c).radius * (*c).radius
//(*c).radius 等价 c.radius
return 3.14 * c.radius * c.radius
}
func main() {
var c Circle
fmt.Printf("main c 结构体变量地址 = %p\n",&c)
c.radius = 6.0
//res := (&c).area()
res := c.area()
//go编译器底层做了优化,(&c).area() 等价 c.area()
//因为编译器会自动的加上 &c
fmt.Println("面积是=",res)
fmt.Println("c.radius = ",c.radius)
}

内存图

- 案例 自定义数据类型的方法
package main
import "fmt"
//自定义数据类型
type integer int
func (i integer) print() {
fmt.Println("i=",i)
}
//编写一个方法,可以改变i的值
func (i *integer)change(){
*i = *i +1
}
func main() {
var i integer = 10
i.print()
i.change()
fmt.Println("i的值=",i)
}
- 案例
如果一个类型实现了String()方法,fmt.Println打印的时候就自动调用String()方法
package main
import "fmt"
type Student struct {
Name string
Age int
}
//给*Student实现方法String()
func (stu *Student) String() string{
str := fmt.Sprintf("Name=[%v] Age=[%v]",stu.Name,stu.Age)
return str
}
func main() {
stu :=Student{Name:"tom",Age:20}
//自动调用*Student的String方法
fmt.Println(&stu)
}
课堂练习:
1、打印10*8矩阵
package main
import "fmt"
type MethodUtils struct {
//字段
}
func (m *MethodUtils) print(){
for i:=0;i<10;i++{
for j:=0;j<8;j++{
fmt.Print("*")
}
fmt.Println()
}
}
func main(){
m :=MethodUtils{}
(&m).print()
}
Tip:格式化输出小数点

方法和函数的区别

网友评论