ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go基础知识梳理(三)

2022-01-31 14:01:07  阅读:111  来源: 互联网

标签:函数 Age 接口 基础知识 Person func 类型 Go 梳理


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
}

标签:函数,Age,接口,基础知识,Person,func,类型,Go,梳理
来源: https://www.cnblogs.com/xiaofua/p/15858236.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有