Go- 方法 -2
发布于: 45 分钟前
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
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/02aa870d5b8eb80198511cca1】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论