golang开发流程及注意事项

栏目: Go · 发布时间: 5年前

内容简介:明确整个业务流程b、正确的响应数据模型c、请求Request参数接收数据结构

golang开发流程及注意事项

1、开发流程

1.1. 复杂框架类服务架构流程

明确整个业务流程

  • 划分独立处理模块,弄清楚那些模块会出现并发

  • 明确基本数据结构

    a、request

    b、response

    c、error错误处理

  • 抽象接口

    针对接口编程,我们必须的定义好每一个环节的接口,这里有一个点必须的 注意 :就是我们在实现接口的时候,NewXXX()获取实现结构类型的返回值必须是借口对象,便于统一处理

  • 明确调度器的职责

  • 中间件

    a、各个独立模块之间如何通信,如何统一管理各个木块之间的通道,通道管理器

    b、如何让各个独立模块统一听从调度器的调度,停止信号处理器、contex包的使用

    c、独立模块的管理和限流,实体池

    d、统一的实体标记管理,Id生成器

    注意:这里有一个限流的问题,一般情况下,我们为解决并发性能问题,都有可能限制客户端的访问数量,但是我们又不可能不去处理超出我们限制的客户请求,因此,对于客户请求,我们一般可以优先放在我们内部的存储器内,定时的把这些请求刷新到通道管理器中

  • 独立处理模块的实现

1.2. Api开发流程

  • 明确业务,设计数据模型

    a、错误的响应数据模型

    错误码、错误数据结构

b、正确的响应数据模型

正确相应编码,以及数据结构

c、请求Request参数接收数据结构

d、业务数据模型

  • 设计错误日志处理方式
  • 数据库操作、orm设计
  • 业务逻辑代码编写
  • 单元测试

1.3. Api的设计原则

Restful风格

  • 资源与URI

    https://github.com/git
      https://github.com/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08

URI设计上的一些技巧:

a、使用_或-来让URI可读性更好

b、使用/来表示资源的层级关系

c、使用?用来过滤资源

d、,或;可以用来表示同级资源的关系

  • 统一资源接口

    RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。

    如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。

    a、GET获取资源表示

    200(OK) - 表示已在响应中发出
    
      204(无内容) - 资源有空表示
      301(Moved Permanently) - 资源的URI已被更新
      303(See Other) - 其他(如,负载均衡)
      304(not modified)- 资源未更改(缓存)
      400 (bad request)- 指代坏请求(如,参数错误)
      404 (not found)- 资源不存在
      406 (not acceptable)- 服务端不支持所需表示
      500 (internal server error)- 通用错误响应
      503 (Service Unavailable)- 服务端当前无法处理请求

b、POST使用服务端管理的(自动产生)的实例号创建资源、创建子资源、部分更新资源

200(OK)- 如果现有资源已被更改

    201(created)- 如果新资源被创建
    202(accepted)- 已接受处理请求但尚未完成(异步处理)
    301(Moved Permanently)- 资源的URI被更新
    303(See Other)- 其他(如,负载均衡)
    400(bad request)- 指代坏请求
    404 (not found)- 资源不存在
    406 (not acceptable)- 服务端不支持所需表示
    409 (conflict)- 通用冲突
    412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
    415 (unsupported media type)- 接受到的表示不受支持
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务当前无法处理请求

c、PUT用客户端管理的实例号创建一个资源、通过替换的方式更新资源

200 (OK)- 如果已存在资源被更改

    201 (created)- 如果新资源被创建
    301(Moved Permanently)- 资源的URI已更改
    303 (See Other)- 其他(如,负载均衡)
    400 (bad request)- 指代坏请求
    404 (not found)- 资源不存在
    406 (not acceptable)- 服务端不支持所需表示
    409 (conflict)- 通用冲突
    412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
    415 (unsupported media type)- 接受到的表示不受支持
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务当前无法处理请求

d、DELETE删除资源

200 (OK)- 资源已被删除

    301 (Moved Permanently)- 资源的URI已更改
    303 (See Other)- 其他,如负载均衡
    400 (bad request)- 指代坏请求
    404 (not found)- 资源不存在
    409 (conflict)- 通用冲突
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务端当前无法处理请求
  • 资源的表述

    a、Request

    GET: https://api.github.com/args/github
      Accept: application/json

b、Response

HTTP/1.1 200 OK
    Content-Type:application/json
  • 在URI里边带上版本号

    http://api.example.com/1.0/foo
      Accept: vnd.example-com.foo+json; version=1.0
      Accept: application/vnd.github.v3

2、字符串

2.1. 比较字符串

进行比较操作时会产生三个问题:

a、有些Unicode编码的字符可以用两个或者多个不同的字节序列来表示

b、有些情况下用户希望把不同的字符看成相同的字符,如:搜索相关

c、有些字符序列和语言相关,如:中文和英文不一样

2.2. 字符和字符串

  • 字符

    一个单一的字符可以用一个单一的rune(或者int32)来表示。其他相关术语,字符、码点、Unicode字符、Unicode码点

  • 字符和字符串的转换

    var  s string = "hello world!"
      c := []rune(s)
      s = string(c)
  • 字符串的联结

    //1、使用+=
      s := "hello"
      b := " world!"
      s += b
      
      //2、使用strings.Join()函数,比+=更有效
      s := []string{"foo", "bar", "baz"}
      fmt.Println(strings.Join(s, ", "))
      
      //3、使用bytes.Buffer,比 += 和join更有效
      s := "hello"
      b := " world!"
      var buffer bytes.Buffer
      buffer.WriteString(s)
      buffer.WriteString(b)
      buffer.String()
  • 字符串索引和切片

    注意:一个英文字符也就是一个Unicode码点占用一个字节[int8|byte]。但是一个中文字符会占用三个字节,因此,我们在循环字符串的时候,通过索引去取单个字符,如果是英文字符是可以正确取到的;如果是中文字符,则只能取到中文字符所占三个字节的第一个字节地址存储数据,因此会造成乱码,所以引出以下几个问题:

    a、字符串边界问题

    b、循环处理字符串乱码问题,也就是索引取值乱码

    解决办法:

    //1、使用[]rune(s)转换为unicode字符在根据索引取值
      //2、使用strings包和unicode包、utf8包
      line L=  "dffh jj wr发生 大幅度 发t yj fd"
      i := strings.IndexFunc(line, unicode.IsSpace)
      firstWord := line[:i]
      i := strings.LastIndexFunc(line, unicode.IsSpace)
      _, size := utf8.DecodeRuneInstring(line[j:])
      lastWord := line(j+size:)
      fmt.Println(firstWord, lastWord)
  • 字符串常用操作包strings

  • 字符串和其他数据类型进行转换 strconv包

3、集合类型

3.1. 值、指针、引用类型

  • 变量持有相应的值,在传递给方法或者函数的时候会被复制一次

  • 指针

    a、因为 go 语言是基于值传递的方式传递参数的,因此,对于传递比较大的数据对象时,我们可以改为传递指针,使得参数的传递成本最低,并且内容可以修改

    b、当我们需要在一个函数或方法中返回三个及以上值的时候,如果这些值是同一类型,我们最好使用一个切片来传递;如果值类型各异,我们最好传递一个指向结构的指针。

注意:指针也可以指向一个引用类型,但只对切片有用

  • 引用类型

    引用类型就是指针

    通道、函数、方法、映射、切片、interface接口类型

3.2、通道


以上所述就是小编给大家介绍的《golang开发流程及注意事项》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

iOS面试之道

iOS面试之道

故胤道长、唐巧 / 电子工业出版社 / 2018-7 / 59.00元

《iOS面试之道》是作者将多年的工作经验和积累,结合具体面试内容总结而成的。 《iOS面试之道》共分为3部分。第1部分为面试准备,详细介绍求职中遇到的基本问题,作者根据其多年的经验,在面试流程、简历投递、复习准备方面给出了完善的参考意见和建议。第2部分为算法知识。算法几乎是各种水平的程序员都要面对的考查内容。该部分采用Swift语言重新审视了多种数据结构和算法原理,可以说是为iOS开发者量身......一起来看看 《iOS面试之道》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具