09.go语言结构体、值接受者/指针接受者、指针和值

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) }