Fork me on GitHub

Go空接口之类型转换

话不多说,直接看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type User struct {
id int
name string
}
func main() {
u := User{1, "Tom"}
var i interface{} = u

u.id = 2
u.name = "Jack"

fmt.Printf("%v\n", u)
fmt.Printf("%v\n", i.(User))
}

输出:

1
2
{2 Jack}
{1 Tom}

在赋值给空接口时,使用指针,再运行看下效果

1
2
3
4
5
6
7
8
9
10
11
12
13
type User struct {
id int
name string
}

func main() {
u := User{1, "Tom"}
var vi, pi interface{} = u, &u //copy u and assign to vi
// vi.(User).name = "Jack" // Error: cannot assign to vi.(User).name
pi.(*User).name = "Jack"
fmt.Printf("%v\n", vi.(User))
fmt.Printf("%v\n", pi.(*User))
}

输出:

1
2
{1 Tom}
&{1 Jack}

空接⼝转型返回临时对象(该临时对象的内存只能读,不能写),只有使⽤指针才能修改其状态。

您的鼓励是我持之以恒的动力