Go基础知识梳理(三)

结构

type Person struct {
name string
sex int
} func main() {
//推荐写法
person := Person{
name: "张三",
sex: 1,
}
//不推荐写法
person = Person{"李四", 1} p := New(Person)
//会初始化name="", sex = 0
}

接口

//接口的一些特点:
//接口的命名一般以er结尾,具体看业务场景
//接口内部的方法不需要func引导
//在接口的定义中没有实现只有声明 type Person inteface{
Say()
Run()
} //具有Person中的方法,则视为该接口的实现类
type Man struct{}
func (m Man) Say(){}
func (m Man) Run(){} type Woman struct{}
func (m Woman) Say(){}
func (m Woman) Run(){}

方法

//首先看一段代码
type Person struct {
Age int
}
func (p Person) Age() {
fmt.Println(p.Age)
}
func (p *Person) Age2() {
fmt.Println(p.Age)
}
//发现两个Age方法,一个接受的是值类型,一个接受的指针,那么区别在哪里呢?
//这两个方法实际等于
func Age(p Person) {
fmt.Println(p.Age)
}
func Age2(p *Person) {
fmt.Println(p.Age)
}
//也就是说相当于参数来进行传值
//传值类型也就是值的拷贝(数据的副本),在函数内改变其数值不会影响到原来的值
//传入的数值类型为指针,就是相当于传入该数据的内存地址,在函数内改变其数值会影响全局
//高级用法
//src/net/http/server.go
type HandlerFunc func(ResponseWriter, *Request) //这是一种包装器的编程技法,为函数添加方法
func (f HandlerFunc) ServeHttp(w ResponseWriter, r *Request) {
f(w, r)
} //同时HandlerFunc实现了Handler接口
type Handler interface{
ServeHttp(ResponseWriter, *Request)
} func (mux *ServeMux) Handle(pattern string, handler Handler) //handler方法转为HandlerFunc函数,同时因为HandlerFunc实现了Handler接口,所以可以运用mux的Handle方法
func (mux *ServeMux) HandlerFunc(pattern string, handler func(ResponseWriter, *Request)) {
mux.Handle(pattern, HandlerFunc(handler))
} 通过 http 标准库里面对于函数类型的使用,我们可以看到函数类型的如下意义
( 1 )函数也是一种类型,可以在函数字面量类型的基础上定义一种命名函数类型。
(2 )有名函数和匿名函数的函数签名与命名函数类型的底层类型相同,它们之间可以进行类型转换。
(3 )可以为有名函数类型添加方法,这种为一个函数类型添加方法的技法非常有价值,可以方便地为一个函数增加“拦截”或“过滤”等额外功能,这提供了一种装饰设计模式
(4 )为有名函数类型添加方法,使其与接口打通关系,使用接口的地方可以传递函数类型的变量,这为函数到接口的转换开启了大门

类型断言

//推荐写法
var i interface{}
i = 1
var a int
if _, ok := i.(int); !ok {
//err处理
return
}
a = i.(int)
fmt.Println(a) //或者
var i interface{}
i = 1
if a, ok := i.(int); ok {
fmt.Println(a)
return
}

最新文章

  1. AD域-让共享目录只显示用户有权限访问的文件夹
  2. STM32之通用定时器
  3. 指针数组 vs 数组指针
  4. 如何使Session永不过期
  5. 【EF Code First】Migrations数据库迁移
  6. python3使用requests爬取新浪热门微博
  7. bzoj 2734: [HNOI2012]集合选数 状压DP
  8. iOS 9适配技巧(更新版)
  9. 懵懂oracle之存储过程2
  10. FLP不可能性(FLP impossibility)
  11. osgi Quick Start
  12. db2 事务日志
  13. 第二回 C#和JAVA 语法差异性对比
  14. HDU 2178.猜数字【分析能力练习】【读题能力练习】【8月10】
  15. docker-compose搭建单机多节点es + kibana
  16. linux每天一小步---ls命令详解
  17. python discover 函数介绍
  18. bzoj1069-最大土地面积
  19. 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
  20. java线程中断[interrupt()函数] (转载)

热门文章

  1. Java架构系列问题合集-目录
  2. .NET 7 预览版来啦,我升级体验了
  3. 基于Python的某大学某学院新生高考成绩分析
  4. sql 同步远程数据库(表)到本地
  5. 初识 oracle!
  6. CKKS Part4: CKKS的乘法和重线性化
  7. Redis为什么是单线程,高并发快的3大原因详解
  8. 如何修改TOMCAT的默认主页为你自己项目的主页
  9. 测试前期API未实现时,如何写测试方法
  10. 一键部署lnmp