golang過濾,golang過濾器模式

本文目錄一覽:

golang 過濾器怎麼返回json對象

innodb_data_home_dir = /longxibendi/mysql/mysql/var/

#innodb_data_file_path = ibdata1:1G:autoextend

innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend #表空間

innodb_file_io_threads = 4 #io線程數

【golang】海量數據去重-布隆過濾器

在做域名爆破中,遇到了把一個300G的子域名json文件進行去重,一開始是考慮使用字典進行去重,但是數據量大了,會造成內存泄露。看網上資料介紹了一種方案,就是使用布隆過濾器。

布隆過濾器是一種數據結構,概率型數據結構,特定是高效插入和查詢,可以用來告訴你“某一值一定不存在或者kennel存在”。

相比於傳統的map、set等數據結構,佔用空間更少,但其返回結果是概率型的,不確定。

布隆過濾器內部維護一個bitArray(位數組),開始所有數據為0,當一個元素過來時,能過多個哈希函數(hash1、hash2、hash3)計算不同的hash值,並通過hash值找到bitArray的下標,將裡面的值改為由0變為1。布隆過濾器有一個誤判率,誤判率越低,數組越長,所在空間越大,誤判率越高,數組越小,所佔空間越小。

這裡貼上一個技術大牛的博客地址,裡面對布隆過濾器用法以及在redis裡面處理緩存穿透問題的詳細介紹。

組件分享之後端組件——基於Golang實現的高性能和彈性的流處理器benthos

近期正在探索前端、後端、系統端各類常用組件與工具,對其一些常見的組件進行再次整理一下,形成標準化組件專題,後續該專題將包含各類語言中的一些常用組件。歡迎大家進行持續關注。

本節我們分享的是基於Golang實現的高性能和彈性的流處理器 benthos ,它能夠以各種代理模式連接各種 源 和 接收器,並對有效負載執行 水合、濃縮、轉換和過濾 。

它帶有 強大的映射語言 ,易於部署和監控,並且可以作為靜態二進制文件、docker 映像或 無服務器函數 放入您的管道,使其成為雲原生。

Benthos 是完全聲明性的,流管道在單個配置文件中定義,允許您指定連接器和處理階段列表:

Apache Pulsar, AWS (DynamoDB, Kinesis, S3, SQS, SNS), Azure (Blob storage, Queue storage, Table storage), Cassandra, Elasticsearch, File, GCP (Pub/Sub, Cloud storage), HDFS, HTTP (server and client, including websockets), Kafka, Memcached, MQTT, Nanomsg, NATS, NATS JetStream, NATS Streaming, NSQ, AMQP 0.91 (RabbitMQ), AMQP 1, Redis (streams, list, pubsub, hashes), MongoDB, SQL (MySQL, PostgreSQL, Clickhouse, MSSQL), Stdin/Stdout, TCP UDP, sockets and ZMQ4.

1、docker安裝

具體使用方式可以參見該 文檔

有關如何配置更高級的流處理概念(例如流連接、擴充工作流等)的指導,請查看 說明書部分。

有關在 Go 中構建您自己的自定義插件的指導,請查看 公共 API。

golang的iris框架的模版如何相互引用?

1.用{{}}包圍的是變量,如 {{testName}} ,這表示把給定變量的值插入, {%%}這是塊元素 在faygo里叫tag,常見的有 for , if 等

2.如何在模板中定義變量, 平常我們在使用的模板的時候的常會有這樣的需要,在模板中要定義一個變量以方便前端邏輯的實現,在faygo模板中定義變量需要用到標籤{%set%}

使用方法

{#定義變量 newName #}

{% set newName = “hello faygo” %}

{#獲取變量newName的值#}

{{newName}}

定義用 tag set 取值就是上文所提到的{{}}取值

3.在模板中調用方法

這也是一個非常常見和有用的方法,在faygo中調用方法有兩種方式 , 一是在渲染模板時在faygo.Map在加入你要調用的方法 , 二是註冊一個全局的方法 (在faygo里叫filter過濾器),我們分別來看一下每個方法的實現

1) 在渲染模板時加入方法(render)

//在後端render時加入方法 testFunc

rErr := ctx.Render(200, switchDir+”index.html”, faygo.Map{

“TITLE”: title,

“testMap”: map[string]string{“aaa”: “111111”},

“testFunc”: func(s string) string {

return s + ” this is test func”

},

})

{#前端模板中調用#}

{{ testFunc(“hello”) }}

結果如下

hello this is test func

這種方法適合只用於此模板一個特殊方法 , 在其它功能中不通用 ,那麼如果想定義一個方法全局都可以使用怎麼辦,這裡就需要註冊全局方法了(見下文)

2)註冊全局方法(過濾器)

如果想定義一個方法全局都可以使用怎麼辦 ,這裡就需要註冊一個方法

// pongo2 註冊一個全局過濾器,一般在程序啟動時init中註冊

//這裡註冊了一個名叫testFilter的過濾器,指向TestFilterFunc方法

pongo2.RegisterFilter(“testFilter”, TestFilterFunc)

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

a := in.String() + ” this is global filter”

return pongo2.AsValue(a), nil

}

在這裡我們看到TestFilterFunc方法里接收參數和返回參數的類型是pongo2.Value和pongo2.Error

在註冊過濾器里方法的接收參數和返回參數是固定的這兩個不能改變

官網的話:

All functions’ parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.

那麼我們返回數據時怎麼返回? 在上面例子在我們看到了 AsValue 這個方法可以將我們數據返回,我們可以返回struct,map,array,string 等

在前端調用

{{ “hello” | testFilter }}

結果:

hello this is global filter

返回結構體:

type LoginUserInfo struct {

Username string `json:”username”`

Telephone string `json:”telephone”`

Email string `json:”email”`

Level int `json:”level”`

}

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

userInfo := LoginUserInfo{

Username: “userA”,

Telephone: “123456”,

Email: “123456@test.com”,

Level: 1,

}

return pongo2.AsValue(userInfo), nil

}

前端使用:

{#定義一個變量接收struct數據 #}

{% set uinfo = “” | testFilter %}

{#取用戶名字#}

{{ uinfo.Username }}

注意,如是 uinfo 只是一個struct 不是struct數組([]uinfo)時 在模板中不能使用{% for %} 使用也不會得到任何數據

如果uinfo是struct數組 在模板中for循環時不要使用 key,val in uinfo

如果uinfo是struct數組 uinfo = []userInfo{}

{#錯誤示例#}

{% for key,val in uinfo %}

{{val.Username}}

{% endfor %}

struct數據不能使用key,否則循環會執行,但取不到任何數據

{# 正確示例 #}

{% for val in uinfo %}

{{val.Username}}

{% endfor %}

說一下返回map時 用for循環的情況,無論是否是map數組都可以用for key,val in uinfo 來遍曆數據

4. 在模板中字符串的連接和宏標籤的使用

在模板中有時我們會碰到這樣的需要:在模板中有幾個變量 ,我們想把這幾個變量連接在一起賦值給另一個變量以做其它操作

例: 在模板中有三個變量 host是域名,route是路由地址,param是參數 ,要把這三個變量連接起來賦值給另一個新的變量做urlencode操作。這應該怎麼辦

因為在模板中使用 + 號連接變量時,程序會認為是數學運算,兩個字符串的連接值為0, 如果用內置的filter: join來連接需要傳入一個slice,但這三個只是字符串變量。

這個時候我們可能就要用到宏標籤了% macro %% endmacro %.

思路是這樣的,在宏標籤中定義一個宏(可以理解為一個方法),這個宏接收三個參數(參數個數看需求而定),在宏內返回連接的字符串

代碼:

{#定義三個變量#}

{% set host=”” %}

{% set route=”/aaa/bbb” %}

{% set param= “?id=123” %}

{#定義一個宏標籤接收三個參數,並返回。注意在宏標籤內如果換行,輸出的結果中也會有換行,在urlencode的時候也會把換行符進行轉義#}

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}

hr

{#定義一個新變量調用宏方法,並將三個參數傳入#}

{% set newurl = joinUrl(host,route,param) %}

{#輸出newurl的值#}

{{newurl}}br

{#輸入出urlencode後的字符串#}

{{newurl|urlencode}}br

結果:

http%3A%2F%2F

在宏標籤在也可加入自定義的一些字符串如在上面的宏標籤返回結果中要加一個固定字符可以這樣寫:

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306613.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 12:01
下一篇 2025-01-02 12:01

相關推薦

  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • 手機安全模式怎麼解除?

    安全模式是一種手機自身的保護模式,它會禁用第三方應用程序並使用僅限基本系統功能。但有時候,安全模式會使你無法使用手機上的一些重要功能。如果你想解除手機安全模式,可以嘗試以下方法: …

    編程 2025-04-28
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 顯示C++設計模式

    本文將詳細介紹顯示C++設計模式的概念、類型、優點和代碼實現。 一、概念 C++設計模式是在軟件設計階段定義,用於處理常見問題的可重用解決方案。這些解決方案是經過測試和驗證的,並已…

    編程 2025-04-27
  • Centos7進入單用戶模式的解釋

    本文將介紹如何在Centos7中進入單用戶模式,並從以下幾個方面進行詳細的闡述。 一、Centos7進入單用戶模式的解答 在Centos7中進入單用戶模式需要執行以下步驟: 1. …

    編程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什麼 PSM模式,即頁面-狀態-模型模式,是一種前端開發模式。它以頁面為中心,將頁面內的所有狀態和業務邏輯抽象成一個由頁面轉化而來的虛擬狀態機模型,從而將業務邏輯與…

    編程 2025-04-25
  • Spring Boot Filter過濾器

    Spring Boot是當前非常流行的Java Web開發框架,它提供了一個非常方便的方式來創建和運行Web應用程序。相比於傳統的Java EE應用程序,它更加簡單易用、依賴性更少…

    編程 2025-04-25
  • 授權碼模式與OAuth2.0

    一、什麼是授權碼模式 授權碼模式(Authorization Code Grant Type)是OAuth2.0協議中最常用的授權方式之一,也是最為安全的一種授權方式。授權碼模式的…

    編程 2025-04-24
  • 布谷鳥過濾器詳解

    布谷鳥過濾器是一種高效的數據結構,主要用於判斷一個元素是否存在於一個集合中。它基於哈希表實現,以空間換時間,具有優秀的時間和空間複雜度。本文將從應用場景、原理、實現方式、優缺點等多…

    編程 2025-04-24

發表回復

登錄後才能評論