基于 go 实现简单 HashMap,暂未做 key 值的校验。
package main import ( "fmt" ) type HashMap struct { key string value string hashCode int next *HashMap } var table [16](*HashMap) func initTable() { for i := range table{ table[i] = &HashMap{"","",i,nil} } } func getInstance() [16](*HashMap){ if(table[0] == nil){ initTable() } return table } func genHashCode(k string) int{ if len(k) == 0{ return 0 } var hashCode int = 0 var lastIndex int = len(k) - 1 for i := range k { if i == lastIndex { hashCode += int(k[i]) break } hashCode += (hashCode + int(k[i]))*31 } return hashCode } func indexTable(hashCode int) int{ return hashCode%16 } func indexNode(hashCode int) int { return hashCode>>4 } func put(k string, v string) string { var hashCode = genHashCode(k) var thisNode = HashMap{k,v,hashCode,nil} var tableIndex = indexTable(hashCode) var nodeIndex = indexNode(hashCode) var headPtr [16](*HashMap) = getInstance() var headNode = headPtr[tableIndex] if (*headNode).key == "" { *headNode = thisNode return "" } var lastNode *HashMap = headNode var nextNode *HashMap = (*headNode).next for nextNode != nil && (indexNode((*nextNode).hashCode) < nodeIndex){ lastNode = nextNode nextNode = (*nextNode).next } if (*lastNode).hashCode == thisNode.hashCode { var oldValue string = lastNode.value lastNode.value = thisNode.value return oldValue } if lastNode.hashCode < thisNode.hashCode { lastNode.next = &thisNode } if nextNode != nil { thisNode.next = nextNode } return "" } func get(k string) string { var hashCode = genHashCode(k) var tableIndex = indexTable(hashCode) var headPtr [16](*HashMap) = getInstance() var node *HashMap = headPtr[tableIndex] if (*node).key == k{ return (*node).value } for (*node).next != nil { if k == (*node).key { return (*node).value } node = (*node).next } return "" } //examples func main() { getInstance() put("a","a_put") put("b","b_put") fmt.Println(get("a")) fmt.Println(get("b")) put("p","p_put") fmt.Println(get("p")) }
通过 range 获取参数列表:
package main import ( "fmt" "os" ) func main() { fmt.Println(len(os.Args)) for _, arg := range os.Args { fmt.Println(arg) } }
循环键值对
package main import "fmt" func main(){ nums := []int{1,2,3,4} for i,num := range nums { fmt.Printf("索引是%d,长度是%d\n",i, num) } }
输出结果为:
索引是0,长度是1 索引是1,长度是2 索引是2,长度是3 索引是3,长度是4
Go Range 简单循环:
package main import "fmt" func main(){ nums := []int{1,2,3,4}; length := 0; for range nums { length++; } fmt.Println( length); }
slice 的底层是数组指针,所以 slice a 和 s 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
2165Go 语言Map(集合)
基于 go 实现简单 HashMap,暂未做 key 值的校验。
2164Go 语言范围(Range)
通过 range 获取参数列表:
2163Go 语言范围(Range)
循环键值对
输出结果为:
2162Go 语言范围(Range)
Go Range 简单循环:
2161Go 语言切片(Slice)
slice 的底层是数组指针,所以 slice a 和 s 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
package mainimport "fmt"func main() {s := []int{1, 2, 3} // len=3, cap=3a := ss[0] = 888s = append(s, 4)fmt.Println(a, len(a), cap(a)) // 输出:[888 2 3] 3 3fmt.Println(s, len(s), cap(s)) // 输出:[888 2 3 4] 4 6}