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

标签 go

在go中,我们可以扩展string等原始类型,并可以定义它的方法。

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

如何定义处理自身指针的方法并修改它。

下面的方法不起作用:

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

(不匹配的类型 *MyStrstring)

最佳答案

对这段代码最大的反对意见是字符串是不可变的。因此,按照设计,需要许多间接步骤才能使其正常工作。如果 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/

相关文章:

go - 你怎么知道你的 github golang repo 是否被使用了?

exec - google golang exec 退出状态 2 和 1

php - Golang - 有 bcadd/bcsub 包吗?

go - 获取变量\"$address\"不能是非输入类型\"String!\in go-graphql

未设置谷歌云功能默认环境变量

go - 没有实例的 TypeOf 并将结果传递给函数

amazon-web-services - 如何从 AWS lambda 执行 exe 文件

go - 将未知大小的 io.Reader 读入 golang 中的字节数组

go - 什么时候指针的类型别名等同于go中的其他类型?

go - 为什么要连续声明 "var _ I = T{}"和 "var _ I = &T{}"?