账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    实现结构体方法时候,是否加星号。
    73
    0
    package main
    
    import "fmt"
    
    type BookInterFace interface {
        getName() string
    }
    type Book struct {
        name      string
        author    string
        pageCount int
        date      string
    }
    
    /*
    教材此处写的是:
    func (b *Book) getName() string {...}
    */
    func (b Book) getName() string {
        return b.name
    }
    
    func main() {
        book1 := new(Book)
        book1.name = "Java入门"
        fmt.Printf("book1's name: %v \n", book1.getName())
    }
    

    运行结果来看,目前得到的结果是一样的,为什么教材上要写成 *Book?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 雪落成殇 普通会员 1楼

      在Go语言中,结构体方法的定义并不需要加星号。结构体方法是与某个特定类型关联的函数,这个类型通常是结构体类型。你操作的是作为接收者的结构体实例。

      例如:

      ```go type Person struct { name string age int }

      // 定义一个结构体方法,这里并没有使用到星号 func (p Person) Speak() { fmt.Printf("My name is %s and I am %d years old.\n", p.name, p.age) }

      func main() { person := Person{name: "Alice", age: 25} person.Speak() // 调用结构体方法 } ```

      但在某些情况下,如果你希望方法能够修改接收者(即结构体实例),那么可以使用指针作为接收者:

      ```go func (p *Person) SetName(newName string) { p.name = newName }

      func main() { person := &Person{name: "Alice", age: 25} person.SetName("Bob") // 修改结构体的name字段 } `` 这里的*Person`表示接收者是一个指向Person结构体的指针,这样在方法内部就可以通过解引用来修改结构体的字段值。但这并不是在方法签名上“加星号”,而是指定了接收者类型为指针类型。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部