代码如下

package main

import (
	"fmt"
	"io/ioutil"
	"regexp"
)

func main() {
	// 读取文件内容
	data, err := ioutil.ReadFile("text.txt")
	if err != nil {
		fmt.Println(err)
		return
	}

	// 将文件内容转换为字符串
	text := string(data)

	// 定义正则表达式
	reURL := regexp.MustCompile(`(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?`)
	reIP := regexp.MustCompile(`\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b`)

	// 查找所有 URL 和 IP
	urls := reURL.FindAllString(text, -1)
	ips := reIP.FindAllString(text, -1)

	// 去重
	urlMap := make(map[string]bool)
	for _, url := range urls {
		urlMap[url] = true
	}
	ipMap := make(map[string]bool)
	for _, ip := range ips {
		ipMap[ip] = true
	}

	// 输出结果
	fmt.Println("URLs:")
	for url := range urlMap {
		fmt.Println(url)
	}
	fmt.Println("IPs:")
	for ip := range ipMap {
		fmt.Println(ip)
	}
}

从本地文件中读取文本,然后使用正则表达式来查找文本中的所有 URL 和 IP,并去重后输出结果。

ioutil.ReadFile 函数,它的作用是读取文件内容并将其转换为字节切片。它的用法如下:

data, err := ioutil.ReadFile(filename)
filename 参数是文件的路径,可以是相对路径或绝对路径。如果读取成功,data 变量将保存文件内容的字节切片,err 变量将为 nil;如果读取失败,err 变量将保存一个错误对象,data 变量的值将是未定义的。

regexp.MustCompile 函数,它的作用是编译正则表达式并返回一个正则表达式匹配器。它的用法如下:

regexp := regexp.MustCompile(pattern)
pattern 参数是正则表达式的字符串形式,它的语法和用法与其他语言的正则表达式类似。如果编译成功,regexp 变量将保存一个正则表达式匹配器;如果编译失败,程序将退出并打印错误信息。

FindAllString 方法,它的作用是在文本中查找所有与正则表达式匹配的字符串,并返回一个字符串切片。它的用法如下:

strings := regexp.FindAllString(text, n)
如果 n 参数为正数,则返回不超过 n 个匹配结果;如果 n 参数为负数,则返回所有匹配结果。如果没有找到任何匹配结果,则返回一个空切片。

golang map去重复
在这个例子中,我们使用make 函数创建了一个空的 map[string]bool 类型的 map,用于存储去重后的 URL。然后使用 for 循环遍历 urls 切片,对于每个 URL,将其作为键插入 map 中。

如果这个 URL 在 map 中已经存在,则不会重复插入,因为 map 中的键是唯一的。如果这个 URL 不存在,则会在 map 中新增一个键值对。

最后,我们输出 map 中的所有键,这样就可以得到所有去重后的 URL