Go - 如何在其方法中修改扩展基元类型?

时间:2014-05-26 12:36:10

标签: go

在go中,我们可以扩展基本类型,例如string左右,并且可以定义它的方法。

func (s MyStr) Saying() MyStr {
    return s + ", someone said."
}

如何定义处理其自身指针的方法并对其进行修改。

以下方法无效:

func (s *MyStr) Repeat() {
    s = s + ", " + s
}

(不匹配的类型*MyStrstring

1 个答案:

答案 0 :(得分:0)

对此代码应该有的最大反对意见是字符串是不可变的。因此,按照设计,需要多个间接步骤才能使其工作。如果MyStr是bytes.Buffer,或者是可变的东西,那么获得你想要的行为会容易得多。

然而,在我们开始之前,有一个非常容易和明显的错误需要修复。要添加s和“,”,您可以将字符串转换为MyStr,如下所示:

temp := *s + MyStr(", ") + *s 
s = &temp //Still doesn't work

当然,由于字符串是不可变的,因此您没有更改s过去指向的字符串。您更改的s只是在函数调用中创建的副本;你还没有真正取得任何成就。

这是一个使用bytes.Buffer包的版本,它是可变的。

package main

import "fmt"
import "bytes"

// Not aliasing the type, but embedding, 
// so that we can use it as a receiver
type MyStr struct {*bytes.Buffer}

func (s MyStr) Repeat() {
    temp := s.Bytes()
    s.Write(bytes.NewBufferString(", ").Bytes())
    s.Write(temp)
}


func main() {
    a := MyStr{bytes.NewBufferString("a")}
    a.Repeat()
    fmt.Println(a)
}

// Prints 'a, a'