09.go语言结构体、值接受者/指针接受者、指针和值
1.结构体
package main
import (
“log”
)
//结构体
type user struct {
name string
email string
ext int
privileged bool
}
//嵌套结构体
type admin struct {
person user
level string
}
func main() {
lisa := user{name: "Lisa",
email: "lisa@email.com",
ext: 123,
privileged: true}
log.Println(lisa)
fred := admin{
person: user{
name: "Lisa",
email: "lisa@email.com",
ext: 123,
privileged: true},
level: "super",
}
log.Println(fred)
}
2.使用指针接收者声明的方法
:调用时会使用这个值的一个副本来执行
使用值接受者声明方法
:
// 这个示例程序展示如何声明
// 并使用方法
package main
import (
"fmt"
)
// user 在程序里定义一个用户类型
type user struct {
name string
email string
}
// notify 使用值接收者实现了一个方法
func (u user) notify() {
fmt.Printf("Sending User Email To %s<%s>\n",
u.name,
u.email)
}
// changeEmail 使用指针接收者实现了一个方法
func (u *user) changeEmail(email string) {
u.email = email
}
// main 是应用程序的入口
func main() {
// user 类型的值可以用来调用
// 使用值接收者声明的方法
bill := user{"Bill", "bill@email.com"}
bill.notify()
// 指向 user 类型值的指针也可以用来调用
// 使用值接收者声明的方法
lisa := &user{"Lisa", "lisa@email.com"}
//此处可以理解为(*lisa).notify()
//notify 操作的是一个副本,只不过这次操作的是
//从 lisa 指针指向的值的副本
lisa.notify()
// user 类型的值可以用来调用
// 使用指针接收者声明的方法
bill.changeEmail("bill@newdomain.com")
bill.notify()
// 指向 user 类型值的指针可以用来调用
// 使用指针接收者声明的方法
lisa.changeEmail("lisa@newdomain.com")
lisa.notify()
}
总结一下,
值接收者使用值的副本来调用方法,
而指针接受者使用实际值来调用方法。
3.传递指针和值的区别
package main
import (
"log"
)
type user struct {
name string
email string
}
func (u user) notify(temp int) {
temp = 124
log.Println(temp)
}
func (u user) notify2(temp *int) {
*temp = 250
log.Println(*temp)
}
// main 是应用程序的入口
func main() {
bill := user{"a", "b@qq.com"}
temp := 123
bill.notify(temp)
log.Println(temp)
bill.notify2(&temp)
log.Println(temp)
}