You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中从Domains.txt提取域名前缀生成%DomainName%变量

解决Go语言提取域名前缀的问题

核心思路

要提取.com或.net之前的域名部分,你可以按以下步骤操作:

  • 逐行读取Domains.txt文件内容(避免一次性读取大文件占用过多内存)
  • 对每个域名字符串,定位.com或.net的起始位置,截取之前的子串
  • 处理空行、无目标后缀等异常情况

代码实现示例

以下是完整可运行的代码,包含逐行读取和处理逻辑:

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	// 打开目标文件
	file, err := os.Open("Domains.txt")
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}
	defer file.Close()

	// 逐行扫描文件内容
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		domain := strings.TrimSpace(scanner.Text())
		if domain == "" {
			continue // 跳过空行
		}

		// 提取域名前缀:优先匹配.com,再匹配.net
		var domainName string
		if idx := strings.Index(domain, ".com"); idx != -1 {
			domainName = domain[:idx]
		} else if idx := strings.Index(domain, ".net"); idx != -1 {
			domainName = domain[:idx]
		} else {
			fmt.Printf("域名 %s 不包含.com或.net后缀,跳过\n", domain)
			continue
		}

		// 这里可以直接使用domainName变量,或存入切片做后续处理
		fmt.Printf("DomainName: %s\n", domainName)
	}

	// 检查扫描过程中的错误
	if err := scanner.Err(); err != nil {
		fmt.Printf("读取文件出错: %v\n", err)
	}
}

关键细节说明

  • 使用bufio.Scanner逐行读取,适合处理大文件,内存占用更可控
  • strings.TrimSpace用于去除每行首尾的空格、换行符,避免无效内容干扰
  • 若需要支持更多后缀(如.org),直接扩展else if分支即可
  • 加入了完整的错误处理:文件打开失败、读取错误、无目标后缀的情况都做了对应处理

更严谨的域名解析方案(可选)

如果需要处理sub.example.com这类多级域名,可使用Go标准库net包做专业解析,确保提取主域名前缀:

import "net"

// 解析域名获取主域名前缀
func getDomainPrefix(domain string) (string, error) {
	host, _, err := net.SplitHostPort(domain)
	if err != nil {
		// 无端口时直接使用原域名
		host = domain
	}

	// 正向解析获取IP
	ips, err := net.LookupIP(host)
	if err != nil {
		return "", err
	}
	if len(ips) == 0 {
		return "", fmt.Errorf("无法解析域名 %s", host)
	}

	// 反向解析获取主域名
	names, err := net.LookupAddr(ips[0].String())
	if err != nil {
		return "", err
	}
	if len(names) == 0 {
		return "", fmt.Errorf("反向解析失败")
	}

	// 处理域名格式,提取前缀
	mainDomain := strings.TrimSuffix(names[0], ".")
	parts := strings.Split(mainDomain, ".")
	if len(parts) >= 2 {
		return strings.Join(parts[:len(parts)-1], "."), nil
	}
	return mainDomain, nil
}

这个方案适合生产环境处理复杂域名场景,若仅需简单处理.com/.net前缀,第一个示例已足够满足需求。

内容的提问来源于stack exchange,提问作者learningcoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:30