1.结构体
package main
import (
//结构体
//嵌套结构体
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) }