您的位置:首页 > 编程语言 > Go语言

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

2018-02-13 11:11 791 查看

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)

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: