接上节,获得可变参数类型,可变参数为interface{}类型时,可以传入任何类型的值。
func printTypeValue(slist ...interface{}) string {
//字节缓冲作为快速字符串连接
varb bytes.Buffer
//遍历参数
for_, s := range slist {
//将interface{}类型格式化为字符串
str := fmt.Sprintf("%v", s)
//类型的字符串描述
var type Stringstring
//判读s类型
switch s.(type) {
casebool:
typeString = "bool"
casestring:
typeString = "string"
caseint:
typeString = "int"
}
//写值字符串前缀
b.WriteString("value:")
//写入值
b.WriteString(str)
//写入类型前缀
b.WriteString(" type:")
//写入类型字符串
b.WriteString(typeString)
//添加换行符
b.WriteString("\n")
}
return b.String()
}
//将不同类型的变量通过printTypeValue()打印出来
fmt.Println(printTypeValue(88,"one",false,99))
输出:
value:88 type: int
value:one type: string
value:false type: bool
value:99 type: int
在多个可变参数函数中传递参数
//实际打印的函数
func rawPrint(rawList ...interface{}){
for_, a:=range rawList{
//打印参数
fmt.Println(a)
}
}
//打印函数封装
func print(slist ...interface{}){
//将slist可变参数切片完整传递给下一个函数
rawPrint(slist...)
}
//传输参数
print(2,5,8)
Go语言中用defer语句会将其后面跟随的语句进行延迟处理
fmt.Println("deferbegin")
//将defer放入延迟调用栈
defer fmt.Println(1)
defer fmt.Println(2)
//最后一个放入,位于栈顶,最新调用
defer fmt.Println(3)
fmt.Println("deferend")
输出:
defer begin
defer end
3 2 1
接下来我们看结构体(struct)
结构体的定义:
Type 类型名 struct{
字段1 字段1 类型
字段2 字段2 类型
….
}
type Point struct{
X int
Y int
}
var p Point
p.X=10
p.Y=8
初始化结构体的成员变量,使用键值对赋值给结构体
type People struct{
name string
child*People
}
relation:=&People{
name:"爷爷",
child:&People{
name:"爸爸",
child:&People{
name:"我",
},
},
}
我们看看匿名结构体
//打印消息类型,传入匿名结构体
func printMsgType(msg * struct{
id int
data string
}){
//使用动词%T打印msg的类型
fmt.Println("%T\n",msg)
}
//实例化一个匿名结构体
msg:=&struct{
id int
data string
}{
1024,
"long",
}
printMsgType(msg)
为类型添加方法
//将int定义为MyInt类型
type MyInt int
//为MyInt添加IsZero()方法
func (m MyInt) IsZero() bool {
return m == 0
}
//为MyInt添加Add()方法
func (m MyInt) Add(other int) int {
return other + int(m)
}
int f MyInt
fmt.Println(f.IsZero())
f = 1
fmt.Println(f.Add(2))
类型内嵌和结构体内嵌
//基础颜色
type BasicColor struct {
R,G, B float32
}
type Color struct {
//将基本颜色作为成员
BasicBasic Color
//透明度
Alpha float32
}
var cc Color
//设置基本颜色分量
cc.Basic.R = 1
cc.Basic.G = 1
cc.Basic.B = 0
//设置透明度
cc.Alpha = 1
//显示整个结构体内容
fmt.Printf("%+v", cc)
接下来我们来看看接口,前面我们代码中已经含有了,接口就是双方约定的一种合作协议。
Type接口类型名 interface{
方法名1 (参数列表1) 返回值列表1
方法名2(参数列表2) 返回值列表2
…
}
//定义一个数据写入器
type DataWriter interface {
WriteData(data interface{}) error
}
//定义文件结构,用于实现DataWriter
type file struct {
}
//实现DataWriter接口的WriteData()方法
func (d *file) WriteData(data interface{}) error {
//模拟写入数据
fmt.Println("WriteData:", data)
return nil
}
//实例化file
fa := new(file)
//声明一个DataWriter的接口
var writer DataWriter
//将接口赋值fa,也就是*file类型
writer = fa
//使用DataWriter接口进行数据写入
writer.WriteData("data")
多个类型可以实现相同的接口
//一个服务器需要满足能够开启和写日志的功能
type Service interface {
Start() //开启服务
Log(string) //日志输出
}
//日志器
type Logger struct{}
//实现Service的Log()方法
func (g *Logger) Log(l string) {
}
//游戏服务
type GameService struct {
Logger
}
//实现Service的Start()方法
func (g*GameService) Start() {
}
varsa Service = new(GameService)
sa.Start()
sa.Log("hai")
请开始你的表演,践行,践行,再践行。未完待续。。。