https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往

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)

}
posted @ 2018-02-13 11:12  鱼酱  阅读(468)  评论(0编辑  收藏  举报

https://img-blog.csdnimg.cn/32db9ce43ef64316a2e37a31f4cee033.gif
编程小鱼酱yu612.com,点击前往