如何在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
相关产品推荐
相关产品推荐

