import "fmt"

func main() {
    email := "learning@gmail.com"
    atTrue := false
    s := ""
    for i := 0; i < len(email); i++ {
        if atTrue {
            s += string(email[i])
        }
        if string(email[i]) == "@" {
            atTrue = true
        }
    }
    fmt.Println(s)
}

电流输出:gmail.com

预期输出:域:gmail和TLD:com

如何表示从某个字符串到某个字符串的循环?

推荐答案

使用strings.Split函数

    email := "learning@gmail.com"
    split := strings.Split(email, "@")
    split = strings.Split(split[1], ".")
    fmt.Println("Domain:", split[0])
    fmt.Println("TLD:", split[1])

或者,您可以使用mail.ParseAddress函数验证邮箱字符串

    email := "learning@gmail.com"
    addr, err := mail.ParseAddress(email)
    if err != nil {
        log.Fatal(err)
    }

如果TLD是这样的co.id,那么输出还是co.id吗? @zacharyy

只需try 找到.(strings.Index)中的第一个index,并使用一个来分隔字符串

    email := "learning@gmail.co.id"
    split := strings.Split(email, "@")
    index := strings.Index(split[1], ".")
    fmt.Println("Domain:", split[1][:index])
    fmt.Println("TLD:", split[1][index+1:])

或使用regexp.Split函数

    email := "learning@gmail.co.id"
    split := strings.Split(email, "@")
    split = regexp.MustCompile("[.]").
        Split(split[1], 2)
    fmt.Println("Domain:", split[0])
    fmt.Println("TLD:", split[1])

strings.SplitN

    email := "learning@gmail.co.id"
    split := strings.Split(email, "@")
    split = strings.SplitN(split[1], ".", 2)
    fmt.Println("Domain:", split[0])
    fmt.Println("TLD:", split[1])

strings.Cut

    _, host, found := strings.Cut(email, "@")
    if !found {
        t.Fatal("fail cut to host (Domain + TLD)")
    }
    domain, tld, found := strings.Cut(host, ".")
    if !found {
        t.Fatal("fail cut to Domain and TLD")
    }
    fmt.Println("Domain:", domain)
    fmt.Println("TLD:", tld)

PLAYGROUND

Benchmarks

    const (
        quantity   = 10000
        userLength = 10
        domain     = "gmail.com"
    )
    var (
        letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
        emails      = make([]string, 0, quantity)
        seeded      = rand.New(rand.NewSource(time.Now().UnixMilli()))
    )

    for i := 0; i < quantity; i++ {
        user := make([]rune, userLength)
        for i := range user {
            user[i] = letterRunes[seeded.Intn(len(letterRunes))]
        }
        emails = append(emails, fmt.Sprintf("%s@%s", string(user), domain))
    }

    b.Run("strings.Split", func(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        var domain, tld string
        for i := 0; i < b.N; i++ {
            for _, email := range emails {
                domain, tld = stringsSplit(email)
            }
        }
        _, _ = domain, tld
    })
    b.Run("strings.SplitN", func(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        var domain, tld string
        for i := 0; i < b.N; i++ {
            for _, email := range emails {
                domain, tld = stringsSplitN(email)
            }
        }
        _, _ = domain, tld
    })
    b.Run("strings.Index+strings.Split", func(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        var domain, tld string
        for i := 0; i < b.N; i++ {
            for _, email := range emails {
                domain, tld = stringsIndexAndStringsSplit(email)
            }
        }
        _, _ = domain, tld
    })
    b.Run("regexp.Split", func(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        var domain, tld string
        for i := 0; i < b.N; i++ {
            for _, email := range emails {
                domain, tld = regexpSplit(email)
            }
        }
        _, _ = domain, tld
    })
    b.Run("strings.Cut", func(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        var domain, tld string
        for i := 0; i < b.N; i++ {
            for _, email := range emails {
                domain, tld = stringsCut(email)
            }
        }
        _, _ = domain, tld
    })
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Benchmark
Benchmark/strings.Split
Benchmark/strings.Split-12                  752    1563851 ns/op      640002 B/op      20000 allocs/op
Benchmark/strings.SplitN
Benchmark/strings.SplitN-12                 805    1463329 ns/op      640003 B/op      20000 allocs/op
Benchmark/strings.Index+strings.Split
Benchmark/strings.Index+strings.Split-12   1416     858783 ns/op      320000 B/op      10000 allocs/op
Benchmark/regexp.Split
Benchmark/regexp.Split-12                    85   14605240 ns/op    11088513 B/op     160024 allocs/op
Benchmark/strings.Cut
Benchmark/strings.Cut-12                   6597     180579 ns/op           0 B/op          0 allocs/op
PASS

Go相关问答推荐

Go汇编器命名为Constants

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

Go Colly-访问for循环中的URL

允许在 struct 中使用复合作为函数参数

Websocket服务器实现与x/net库trowing 403

在 Golang 中查看目录是否可写的跨平台方式?

Golang crypto/rand 线程安全吗?

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

Gorm delete with clauses sqlmock 测试

regex.ReplaceAll 但如果替换则添加相同数量的字符

如何过滤来自 fsnotify 的重复系统消息

go:embed 文件扩展名模式

go 是否对 struct 使用空间填充之类的东西?

Go 使用 struct 作为接口而不实现所有方法

golang 如何从字符串中查找表情符号?

GORM GIN 更新查询导致 500 内部服务器错误

递归数据 struct 解组在 Go Lang Protobuf 中给出错误无法解析无效的线格式数据

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string

Go generics:我会在哪里使用 any 而不是 interface{}?