golang面接基礎シリーズ-rangeの穴(三)
9858 ワード
Goでは、for rangeはslice、map、chanなどを遍歴するために使用され、使用頻度が高いが、遍歴は使いやすいが、ピットを踏みやすく、demoを見ると以下のようになる.
1.戻り値が1つしかない場合、最初のパラメータはindex
出力結果は次のとおりです.
2.遍歴mapはランダムシーケンス出力、sliceはインデックスシーケンス出力
出力結果は次のとおりです.
3.range vは値コピーであり、一度だけ初期化を宣言する
出力結果は次のとおりです.
正しい方法は、goodのコメントの一部を開き、実行結果は以下の通りです.
小結:for rangeは以上のいくつかの小さな穴に注意しています.
1.戻り値が1つしかない場合、最初のパラメータはindexです.2.遍歴mapはランダムシーケンス出力であり、sliceはインデックスシーケンス出力である.3.range vは値コピーであり、一度だけ初期化を宣言する.以上の点を把握したら、rangeを楽しく使いましょう.
1.戻り値が1つしかない場合、最初のパラメータはindex
package main
import "fmt"
func main() {
s := []string{"a", "b", "c"}
// : index
for v := range s {
fmt.Println(v)
}
//
for i, v := range s {
fmt.Println(i, v)
}
}
出力結果は次のとおりです.
0
1
2=============
0 a
1 b
2 c
2.遍歴mapはランダムシーケンス出力、sliceはインデックスシーケンス出力
package main
import "fmt"
func main() {
m := make(map[string]string)
m["aaa"] = "AAA"
m["bbb"] = "BBB"
m["ccc"] = "CCC"
m["ddd"] = "DDD"
m["eee"] = "EEE"
// range map
for i, v := range m {
fmt.Println(i, v)
}
fmt.Println("==================")
s := []string{"aaa", "bbb", "ccc", "ddd", "eee"}
// range slice
for i, v := range s {
fmt.Println(i, v)
}
}
出力結果は次のとおりです.
ddd DDD
eee EEE
aaa AAA
bbb BBB
ccc CCC
==================
0 aaa
1 bbb
2 ccc
3 ddd
4 eee
3.range vは値コピーであり、一度だけ初期化を宣言する
package main
import "fmt"
func main() {
ParseStudent()
}
type student struct {
Name string
Age int
}
func ParseStudent() {
m := make(map[string]*student)
stus := []student{
{Name: "zhang", Age: 22},
{Name: "li", Age: 23},
{Name: "wang", Age: 24},
}
for _, stu := range stus {
// stu , ?
// for range v
// ,
fmt.Printf("%p
", &stu)
// 1. bad
m[stu.Name] = &stu
// 2. good
/*newStu := stu
m[stu.Name] = &newStu*/
}
for i, v := range m {
fmt.Println(i, v)
}
}
出力結果は次のとおりです.
0xc00008e020
0xc00008e020
0xc00008e020
zhang &{wang 24}
li &{wang 24}
wang &{wang 24}
正しい方法は、goodのコメントの一部を開き、実行結果は以下の通りです.
0xc00000c080
0xc00000c080
0xc00000c080
li &{li 23}
wang &{wang 24}
zhang &{zhang 22}
小結:for rangeは以上のいくつかの小さな穴に注意しています.
1.戻り値が1つしかない場合、最初のパラメータはindexです.2.遍歴mapはランダムシーケンス出力であり、sliceはインデックスシーケンス出力である.3.range vは値コピーであり、一度だけ初期化を宣言する.以上の点を把握したら、rangeを楽しく使いましょう.