在go中,我们可以扩展基本类型,例如string
左右,并且可以定义它的方法。
func (s MyStr) Saying() MyStr {
return s + ", someone said."
}
如何定义处理其自身指针的方法并对其进行修改。
以下方法无效:
func (s *MyStr) Repeat() {
s = s + ", " + s
}
(不匹配的类型*MyStr
和string
)
答案 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'