• go基础笔记


    1.slice:作为参数传递时,传递的是地址,当append时,在新的内存地址分配数据,但是没有返回给原的slice,只能通过返回值的方式赋值给slice
    2.func(a []int):传递,可以
    3.匿名函数:函数内部的声明匿名函数
    4.闭包:初始化,使用闭包
    5.defer(延迟):
    1>类似析构函数,在函数执行结束后按照调用顺序,反序执行(栈)
    2>即使发生严重错误也执行,前提是没有发生错误之前先注册
    3>支持匿名函数
    4>常用于资源清理,文件关闭,解锁等
    5>匿名函数访问变量,如果是直接访问,则访问引用(即最后执行时的参数值),如果是传值访问,则是拷贝
    6>go 没有异常机制,但可以panic/recover模式处理错误,panic可以在任何地方引发,recover只有在defer 调用的函数中有效,并且处理panic后,程序可以继续执行
    6.struct:
    语法类似c,功能就是类,成员属性可以无名;
    但必须有类型声明,当出现匿名对象时,必须显式初始化;
    "=="判断:属性相同时返回true,但是对象的地址不同,和equal相同
    7.点运算符与指针:与cc++不同,即使是指针访问属性也使用点语法,所以声明时,保存对象的地址,操作指针时可以使用点语法操作
    8.值传递和引用传递:除了指针、chanel、匿名函数访问是引用传递,其他的都是值传递
    9.匿名结构,初始化,嵌套:嵌套时,匿名属性,只能通过链式赋值的方式赋值
    10.继承:GO中不存在继承关系,但存在组合,即父类结构作为成员存放;
    组合实际是将其属性和方法赋值放在子类中,所以可以直接点语法访问父类的属性和方法;
    当匿名组合与当前组合属性、方法重名时不报错,点语法作用的是当前结构的属性、方法;
    如果想访问匿名结构的同名属性、方法,直接点语法其匿名结构名后访问其属性、方法;
    同级不能同名属性、方法,可以调整组合解决;
    不同级可以同名属性、方法,点语法访问即可。
    11.在线项目api生成:gowalker.org/,阅读开源项目非常方便
    12.方法:method
    接收者receiver,表明方法所属结构,基本数据类型可以type,作为接收者,为其增加方法;
    不支持重载,即同一结构下的方法不允许同名;
    对象调用方法,类方法调用对象;
    属性首字母大写是public,属性首字母小写是包内访问权限;
    13.接口:interface
    >=1个的方法签名集合
    只要实现了方法签名相同的方法,即实现了接口
    接口只是方法声明,没有实现,没有数据字段
    接口可以匿名嵌套,也可嵌套如结构中
    14.多态:OK patern判断
    接口可以指向所有实现接口结构的对象;
    interface{} 可以指向所有对象,使用type swtich判断方便;
    结构之间是组合关系,不存在继承,所以无法多态,无法强转;
    接口调用不会做receiver的自动转换;
    15.反射:
    t.Kind() == reflect.Struct 判断是否是结构类型;
    .()判定其结构类型,.(type)可以通过switch判断;
    v.Field(i).Interface()获得其属性的方法;
    通过反射可以访问、设置属性(匿名属性),调用方法(方法嵌套):
    1>普通属性:
    读:
    访问类型typeof,访问属性值valueof;
    获取field:直接访问FieldByName,顺序访问FieldByIndex;
    获得field值:Interface()
    写:
    reflect.ValueOf(传入指针,否则只是拷贝,拷贝值无法编辑),返回值是指针,无法通过指针设置值;panic: reflect: reflect.Value.SetFloat using unaddressable value
    v = v.Elem(),获得原来数据的引用,直接设置数据即可;panic: reflect: call of reflect.Value.FieldByName on ptr Value
    结构中只有被导出字段(首字母大写)才是可设置的;panic: reflect: reflect.Value.SetString using value obtained using unexported field

    2>匿名属性:可以使用FieldByName、FieldByIndex
    3>普通方法:
    调用:
    args := []reflect.Value{reflect.ValueOf("ss")}
    v.Method(0).Call(args)
    4>嵌套方法:嵌套时和属性一样,都可以直接调用
    16.并发concurrency:
    1>go执行
    2>Channel:
    通过消息来共享内存,channel是引用类型;
    默认是阻塞同步的,make创建,close关闭,否则死锁;
    可设置单项或双向通道,for range迭代;
    可设置缓存大小,未被填满之前不会阻塞:有缓存是异步的,无缓存是同步的;
    并行运行时,可以使用channel、sync进行异步控制,让主程序等待子程序执行完毕后结束;


    WEB部分(beego框架):
    1.controller 与view传值
    {{with .name}} {{end}}
    {{range .name}} {{.}} {{end}}
    2.view内置的模板函数:str2html
    3.orm:增删改查
    所有操作函数都需要传入结构体的指针

  • 相关阅读:
    P2764 最小路径覆盖问题
    P1402 酒店之王 网络流
    P2597 [ZJOI2012]灾难 拓扑排序
    FJOI2017 矩阵填数
    2019.2.27模拟
    2019.2.26模拟
    SDOI2013 方程
    [AH2017/HNOI2017]抛硬币
    Lucas定理和扩展Lucas定理
    LuoguP4861 按钮
  • 原文地址:https://www.cnblogs.com/cz-blog/p/5913823.html
Copyright © 2020-2023  润新知