在go中,我们可以扩展string
等原始类型,并可以定义它的方法。
func (s MyStr) Saying() MyStr {
return s + ", someone said."
}
如何定义处理自身指针的方法并修改它。
下面的方法不起作用:
func (s *MyStr) Repeat() {
s = s + ", " + s
}
(不匹配的类型 *MyStr
和 string
)
最佳答案
对这段代码最大的反对意见是字符串是不可变的。因此,按照设计,需要许多间接步骤才能使其正常工作。如果 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'
关于Go - 如何在其方法中修改扩展原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23870319/