欢迎来到 艾瑞可erik 的魔法世界 🧙‍♂️

一只全栈开发的程序猿,偶尔做做运维、PHP、Goland、Python、Java、摄影、画画、写作、顺便睡觉,反正整站都搞过。

📚 289 篇文章 🏷️ 501 个标签 📂 89 个分类

🔥 最新文章

go中获取HTTP请求的IP地址

package main

import (
    "encoding/json"
    "net/http"
)

func main() {
    http.HandleFunc("/", ExampleHandler)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func ExampleHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Content-Type", "application/json")
    resp, _ := json.Marshal(map[string]string{
        "ip": GetIP(r),
    })
    w.Write(resp)
}

func GetIP(r *http.Request) string {
    forwarded := r.Header.Get("X-FORWARDED-FOR")
    if forwarded != "" {
        return forwarded
    }
    return r.RemoteAddr
}

go中限流器

限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket等。

其实golang标准库中就自带了限流算法的实现,即golang.org/x/time/rate。 该限流器是基于Token Bucket(令牌桶)实现的。

简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放Token,桶满则暂时不放。 而用户则从桶中取Token,如果有剩余Token就可以一直取。如果没有剩余Token,则需要等到系统中被放置了Token才行。

new和make的区别

go中我们往往要对变量分配内存,那么分配内存有两中方式分别是new和make。查了一些资料,顺便看我开发中用的几个地方。其实,很好理解。

new分配中内存,不做初始化,也就是不能直接赋值,必须初始化后才能赋值。

make分配好内存且已经

结构体转map

在go中往redis的hash写数据的时候遇到了结构体数组写入时无法写入,看了看写入数据要求是map[string]interface,而我的是struct。因此,无法写入的。
那么就是转格式呗

type order struct{
    Id int64 `json:"id"`
    orderSn int64 `json:"order_sn"`          
}

orders:=order{
    Id:2022032034566
    OrderSn:20220320122444
}

jsonData,_:=json.Marshal(orders)

var redisData map[string]interface{}

json.Unmarshal([]byte(jsonData),&redisData)

log.Info(redisData)

以上就是转化过程。

hyperf异常

  • Maximum function nesting level of ‘256’ reached, aborting

    先跑了所有接口,发现都是这个报错。梳理新增加的接口方法后,直接屏蔽新接口所有方法逻辑,就恢复正常。依次排除法,最终发现在model里面封装的方法调用了service层的方法导致超负荷加载函数嵌套。
    

10个Web日志安全性分析工具

首先,我们应该清楚的是,日志文件不仅可以帮助我们追踪入侵者的来源并找到其攻击路径,而且在正常的操作和维护中,日志还可以反映出许多安全攻击。
一个简单易用的Web日志分析工具可以大大提高效率。当前,行业中有许多日志分析工具。今天,我们推荐十种易于使用的Web日志安全性分析工具。