go slice 的一个不当的用法

错误示例

package main

import "fmt"

type MyStruct struct{
	Value int
}

func main(){
	ss:=[]MyStruct{
		{Value:1},
		{Value:2},
		{Value:0},
	}
	largest:=&ss[0]//嗯,对,就是这里
	for _,s:=range ss{
		if s.Value>largest.Value{
			largest=&s
		}
		fmt.Printf("%p\n",s)
		fmt.Printf("%p\n",largest)
	}
	fmt.Printf("%v\n",largest)// &{0}
}

正确

都用指针
func main(){
	ss:=[]*MyStruct{
		{Value:1},
		{Value:2},
		{Value:0},
	}
	largest:=ss[0] // 其实只要和slice的元素类型一致,不自作聪明转来转去就可以了~~
	for _,s:=range ss{
		if s.Value>largest.Value{
			largest=s
		}
		fmt.Printf("%p\n",s)
		fmt.Printf("%p\n",largest)
	}
	fmt.Printf("%v\n",largest)
}

都用结构体

func main(){
	ss:=[]MyStruct{
		{Value:1},
		{Value:2},
		{Value:0},
	}
	largest:=ss[0]
	for _,s:=range ss{
		if s.Value>largest.Value{
			largest=s
		}
		fmt.Printf("%p\n",s)
		fmt.Printf("%p\n",largest)
	}
	fmt.Printf("%v\n",largest)
}

用结构体暂存中间结果,指针作为元素

func main(){
	ss:=[]*MyStruct{
		{Value:1},
		{Value:2},
		{Value:0},
	}
	largest:=*ss[0]
	for _,s:=range ss{
		if s.Value>largest.Value{
			largest=*s
		}
		fmt.Printf("%p\n",s)
		fmt.Printf("%p\n",largest)
	}
	fmt.Printf("%#v\n",largest)
}

你可能感兴趣的:(golang)