Golang题 一揽子方案

1.Go的XSS(跨站脚本攻击)的防护应该结合以下两种方式。


1.1 验证所有输入数据,有效检测攻击。
1.2 对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。
func HTMLEscape(w io.Writer, b []byte) // 把 b 进行转义之后写到 w
func HTMLEscapeString(s string) string // 转义 s 之后返回结果字符串
func HTMLEscaper(args ...interface{}) string // 支持多个参数一起转义,返回结果字符串
使用template.HTML()转义用来正常显示输入。


2. defer、return、返回值三者的执行先后逻辑


2.1 多个defer的执行顺序为“后进先出”;
2.2 defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。


3.Go设计模式


Golang设计模式目录 https://www.jianshu.com/p/b31f34cddf81
常见设计模式——go实现 https://zhuanlan.zhihu.com/p/91997566


3.1.1 单例模式(懒汉模式)


type Singleton struct{}
var Instance *Singleton

func GetInstance() *Singleton {
    if Instance == nil {
        Instance = &Singleton{}
    }
    return Instance
}


3.1.2 Once实现懒汉模式


var Instance5 *Singleton
var once sync.Once

func GetInstance5() *Singleton {
    once.Do(func() {
        Instance5 = &Singleton{}
    })
    return Instance5
}


3.2.1 单例模式(饿汉模式)


type Singleton struct{}
var Instance2 *Singleton = &Singleton{}

func GetInstance2() *Singleton {
    return Instance2
}


3.2.2 双重锁的懒汉模式


var Instance4 *Singleton
var mut2 sync.Mutex
func GetInstance4() *Singleton {
    if Instance4 == nil {
        mut2.Lock()
        defer mut2.Unlock()
        if Instance4 == nil {
            Instance4 = &Singleton{}
        }
    }
    return Instance4
}


3.3.1 简单工厂


type Factory struct {
}
type Product interface {
   create()
}
func (f Factory) Generate(name string) Product {
   switch name {
   case "product1":
      return Product1{}
   case "product2":
      return Product2{}
   default:
      return nil
   }
}
//使用
factory := new(Factory)
product1 := factory.Generate("product1")

3.3.2 工厂模式


type FactoryInterface interface {
   CreateProduct(t string) ProductInterface
}
type Factory1 struct {
}
func (f Factory1) CreateProduct(t string) ProductInterface {
    switch t {
    case "product1":
        return product1{}
    default:
        return nil
    }
}
//使用
f := new(Factory1)
p1 := f.CreateProduct("product1")


4. 浅谈 Golang struct 与 PHP class 的相似


Golang 中的 struct 与 PHP 的 class 在使用方式上差不多。
struct 中的成员可以类比 class 中的属性,struct 中的成员函数可以类比 class 中的方法。
对比示例:
// Golang
type CollectorOption func(*Collector)
type Collector struct {
    UserAgent string
    MaxDepth int
}
func NewCollector(options ...CollectorOption) *Collector {

}
func (c *Collector) Visit(URL string) error {
}

// PHP
$options = function (&instance) {
}
class Collector {
  public $userAgent;
  public $maxDepth;

  public function visit(string $url): string
  {
    //
  }
}

function NewCollector(...$options) Collector {
}

5.redis持久化
Redis的持久化有两种方式:RDB和AOF,redis默认采用的是RDB的方式。


RDB:(快照持久化)


触发生成rdb快照文件的方式主要有五种(会生成一个dump.rdb文件):配置文件自动触发、执行save命令、执行bgsave命令、执行shutdown命令、执行flushall命令。
redis.conf 中配置项dbfilename dump.rdb,save m n 同步操作save 60 10000,异步操作bgsave再redis命令行里执行SHUTDOWN或bgsave

AOF(文件追加持久化)


配置文件开启aof持久化方式:appendonly yes appendfilename appendonly.aof
AOF的三种写入策略appendfsync always|everysec|no
redis提供了重写机制来解决对同一个key做多次写操作,从而产生大量文件日志。
可以通过下面命令手动触发重写:bgrewriteaof,也可以通过配置文件自动触发重写:
auto-aof-rewrite-percentage 100:当文件的大小达到原先文件大小
auto-aof-rewrite-min-size 64mb:文件重写的最小文件大小
使用redis-check-aof --fix命令修复AOF文件错误

混合持久化:通过 aof-use-rdb-preamble 参数来开启


在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。

RDB和AOF对比


RDB的优点:节省内存、速度快(二进制形式写入)、适合全量备份和复制场景
RDB的缺点:服务器宕机易丢数据,数据量大易阻塞
每次保存RDB的时候,Redis都要fork出一个子进程,这个过程是阻塞的,如果数据集巨大,那阻塞的时间就会很长。

AOF的优点:数据完整性高,不易丢失,日志文件可读,AOF文件可修复
数据更加完整,丢失数据的可能性较低;
AOF日志文件可读,并且可以对AOF文件修复。
AOF的缺点:AOF日志记录在长期运行中逐渐庞大,恢复很耗时,需定期瘦身处理,恢复备份速度较慢。

6. nodejs部署的服务访问异常

nodejs部署的服务用localhost+端口curl http://localhost:8089可以访问,换成ip+端口curl http://192.168.0.201:8089就无法访问
解决方法1:(无效,防火墙已关闭,添加开放端口无效)
/sbin/iptables -I INPUT -p tcp --dport 8089 -j ACCEPT
service network restart
解决方法2:(有效)
修改或添加online-store\webpack.config.js的port:8089上的host: '0.0.0.0'(不能是127.0.0.1)
再次执行npm run dev出现Project is running at http://0.0.0.0:8089/即可
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值