package main
import("fmt""reflect""unsafe")funcmain(){
a :="aaa"
ssh :=*(*reflect.StringHeader)(unsafe.Pointer(&a))
b :=*(*[]byte)(unsafe.Pointer(&ssh))
fmt.Printf("%v---%T",b,b)// [97 97 97]---[]uint8}
1.3 解释
StringHeader 是字符串在go的底层结构。
type StringHeader struct{
Data uintptr
Len int}
SliceHeader 是切片在go的底层结构。
type SliceHeader struct{
Data uintptr
Len int
Cap int}
package main
import"fmt"funcmain(){
s :=[]int{1,2,3,4,5}for_, v:=range s {
s =append(s, v)
fmt.Printf("len(s)=%v\n",len(s))}}/*
len(s)=6
len(s)=7
len(s)=8
len(s)=9
len(s)=10
*/
6.2 坑2:值全部一样
每次循转中num的值是正常的,但是由append构造的res中,全是nums的最后一个值。
最终总结出原因是在for range语句中,创建了变量num且只被创建了一次。
即num有自己的空间内存且地址在for循环过程中不变
循环过程中每次将nums中对应的值和num进行值传递。
package main
import"fmt"funcmain(){var nums =[]int{1,2,3,4,5}var res []*intfor_, num :=range nums {
res =append(res,&num)//fmt.Println("num:", num)}for_, r :=range res {
fmt.Println("res:",*r)}}/*
res: 5
res: 5
res: 5
res: 5
res: 5
*/
6.3 解决方法
方法1
- 不使用for range的形式,直接用索引来对nums取值
```go
package main
import "fmt"
func main() {
var nums = []int{1, 2, 3, 4, 5}
var res []*int
for i := 0; i < len(nums); i++ {
res = append(res, &nums[i])
}
fmt.Println("res:", res)
for _, r := range res {
fmt.Println("res:", *r)
}
}
方法2
- 在for循环中每次再定义一个新的变量num_temp,将num的值传给num_temp,之后append该变量即可。
```text
package main
import "fmt"
func main() {
var nums = []int{1, 2, 3, 4, 5}
var res []*int
for _, num := range nums {
numTemp := num // 创建一个新的临时变量
res = append(res, &numTemp)
}
for _, r := range res {
fmt.Println("res:", *r)
}
}
/*
res: 1
res: 2
res: 3
res: 4
res: 5
*/