写点什么

Go- 方法 -2

用户头像
HelloBug
关注
发布于: 45 分钟前
Go- 方法-2

Go 学习笔记,学习内容《Go入门指南》


主要介绍以下内容:

  • 显式继承类型的方法继承

  • 多重继承

  • 结构体的格式化输出

  • 垃圾回收和 SetFinalizer


代码示例可以直接运行

package main
import ( "fmt" "runtime" "strconv")
func printDivider(str ...string) { fmt.Println() fmt.Println("-----------------------------------------------") if len(str) > 0 { fmt.Println(str) }}
/*-----------------------------------------*/type Log struct { msg string}
type Customer struct { name string log *Log}
func (log *Log) SetLog(msg string) { log.msg = msg}
func (log *Log) GetLog() string { return log.msg}
/*-----------------------------------------*/type Phone struct{}
func (p *Phone) Call() string { return "Ring Ring"}
type Camera struct{}
func (c *Camera) TakeAPicture() string { return "Click"}
type CameraPhone struct { Camera Phone}
/*-----------------------------------------*/type Base struct{}
func (Base) Magic() { fmt.Println("Base Magic")}
func (b Base) MoreMagic() { b.Magic() b.Magic()}
type Update struct { Base}
func (Update) Magic() { fmt.Println("Update Magic")}
/*-----------------------------------------*/type Pos struct { x int y int}
func (p *Pos) String() string { return "(" + strconv.Itoa(p.x) + "/" + strconv.Itoa(p.y) + ")"}
func main() { /* 显式继承类型的方法继承 */ printDivider("显式继承类型的方法继承") c1 := &Customer{"Lily", &Log{"I am Lily"}} fmt.Println(c1.log.GetLog()) // 输出:I am Lily c1.log.SetLog("I am Mark") fmt.Println(c1.log.GetLog()) // 输出:I am Mark
/* 多重继承-1 */ printDivider("多重继承-1") cp := new(CameraPhone) fmt.Printf("Call %s\n", cp.Call()) // 输出:Call Ring Ring fmt.Printf("TakeAPicture %s\n", cp.TakeAPicture()) // 输出:TakeAPicture Click
/* 多重继承-2 */ printDivider("多重继承-2") u := new(Update) u.Magic() // 输出:Update Magic u.MoreMagic() // 输出:Base Magic\nBase Magic
/* 结构体的格式化输出 自定义结构体的String方法,调用fmt.Println和fmt.Print方法时,会自动调用结构体类型的String方法 注意:不要在自定义的String方法中调用fmt.Println和fmt.Print方法,否则会递归调用,导致栈溢出 */ printDivider("结构体的格式化输出") p1 := Pos{3, 4} fmt.Print(p1) // 输出:{3 4} fmt.Println(p1) // 输出:{3 4} fmt.Printf("%v\n", p1) // 输出:{3 4} fmt.Printf("%T\n", p1) // 输出:main.Pos fmt.Printf("%#v\n", p1) // 输出:main.Pos{x:3, y:4}
p2 := new(Pos) p2.x = 10 p2.y = 20 fmt.Print(p2) // 输出:(10/20) fmt.Println(p2) // 输出:(10/20) fmt.Printf("%v\n", p2) // 输出:(10/20) fmt.Printf("%T\n", p2) // 输出:main.Pos fmt.Printf("%#v\n", p2) // 输出:main.Pos{x:10, y:20}
/* 垃圾回收和SetFinalizer runtime.SetFinalizer(obj, func(obj *typeObj)) 对象obj从内存移除前执行的操作,func函数定义这些操作 */ printDivider("垃圾回收和SetFinalizer") var m runtime.MemStats runtime.ReadMemStats(&m) fmt.Printf("%d KB\n", m.Alloc/1024) // 输出:150 KB 程序已分配的内存总量}
复制代码


发布于: 45 分钟前阅读数: 3
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 方法-2