for和range性能大比拼!

2023年 8月 7日 50.2k 0

能GET到的知识点

  • 什么场景使用for和range

1. 从一个遍历开始

万能的range遍历

  • 遍历array/slice/strings
  • array

    package main  
      
    import "fmt"  
      
    func main() {  
        var UserIDList = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}  
    
        for i, v := range UserIDList {  
            fmt.Println(i, v)  
        }  
    }
    
    0 1
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 9
    9 10
    
    

    slice

    package main  
      
    import "fmt"  
      
    func main() {  
        var UserIDList = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}  
        var UerSlice = UserIDList[:]  
    
        for i, v := range UerSlice {  
            fmt.Println(i, v)  
        }  
    }
    0 1
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 9
    9 10
    

    字符串

    func main(){
        var Username = "斑斑砖abc"  
        for i, v := range Username {  
            fmt.Println(i, v)  
        }
    }
    
    
    0 26001
    3 26001
    6 30742
    9 97
    10 98
    11 99
    
    
    

    range进行对array、slice类型遍历一切都正常,但是到了对字符串进行遍历时这里就出问题了,出问题主要在索引这一块。可以看出索引是每个字节的位置,在go语言中的字符串是UTF-8编码的字节序列。而不是单个的Unicode字符。遇到中文字符时需要使用多个字节表示,英文字符一个字节进行表示,索引0-3表示了一个字符及以此完后。

  • 遍历map
  • func ByMap() {  
        m := map[string]int{  
        "one": 1,  
        "two": 2,  
        "three": 3,  
        }  
        for k, v := range m {  
            delete(m, "two")  
            m["four"] = 4  
            fmt.Printf("%v: %v\n", k, v)  
        }  
    }
    
    one: 1
    four: 4
    three: 3
    
    
    
    • 和切片不同的是,迭代过程中,删除还未迭代到的键值对,则该键值对不会被迭代。
    • 在迭代过程中,如果创建新的键值对,那么新增键值对,可能被迭代,也可能不会被迭代。个人认为应该是hash的无序性问题
    • 针对 nil 字典,迭代次数为 0
  • 遍历channel
  • func ByChannel() {
    ch := make(chan string)
    go func() {
    ch

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论