美文网首页
go 方法使用的深度剖析

go 方法使用的深度剖析

作者: StevenQin | 来源:发表于2019-09-27 00:15 被阅读0次

  • 案例
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:格式化输出小数点

方法和函数的区别

image.png

相关文章

网友评论

      本文标题:go 方法使用的深度剖析

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