在实例生成期间修改结构字段

时间:2018-07-20 10:27:25

标签: go struct

外国应用程序API给了我JSON格式的名称列表。我需要全部修改。
但我不喜欢为此写一些循环(尤其是在Python与反射和材质配合使用之后)

是否有任何方法可以在Go中编写类似的内容?

type MyIncredibleType struct {
    Name    ModifyName  // ModifyName is not a type!
} 

func ModifyName(input string) string {
    return input + ".com"
}

此的预期行为是:

a := MyIncredibleType{Name: "Abracadabra"}
print(a.Name) // Abracadabra.com

2 个答案:

答案 0 :(得分:2)

假设我正确理解了您的问题,这对我来说似乎很简单:

// ModifyName func
func ModifyName(input string) string {
    return fmt.Sprintf("%v.com", input)
}

如果您希望在类型本身内实现此目的,而无需修改(变异)内部状态:

type MyType sturct {
    name string // unexported
}

// accessor func to return name
func (t MyType) Name() string {
    return t.name
}

// accessor func to return modified name
func (t MyType) ModifiedName() string {
    return fmt.Sprintf("%v.com", t.name)
}

如果要修改内部状态:

type MyType struct {
    name string
}

// mutator func (note the pointer for pass by reference)
func (t *MyType) ModifyName(input string) {
    t.name = fmt.Sprintf("%v.com", input)
}

// accessor (note no pointer for pass by value)
func (t MyType) Name() string {
    return t.name
}

答案 1 :(得分:1)

这在GO中是不可能的。这不是结构在Go中的工作方式。

type MyIncredibleType struct {
    Name    ModifyName `json:"name"`  // ModifyName is not a type!
}

您只能为结构字段定义Built-in类型,也可以定义Composite Literal类型。

  

复合文字为结构,数组,切片和结构构造值   每次对其进行映射并创建新值。他们组成   字面量类型,后跟大括号绑定的元素列表。   每个元素都可以选择前面带有相应的键。

尝试创建结构的方法接收器,您将使用该结构来解析来自api的json来修改名称。这将使您实现与所需目标相似的目标。

package main

import (
    "fmt"
)

type MyIncredibleType struct {
    Name    string `json:"name"`  // ModifyName is not a type!
} 

func(myIncredibleType *MyIncredibleType) ModifyName() string {
    return myIncredibleType.Name+".com"
}

func main() {
    a := MyIncredibleType{Name: "Abracadabra"}
    name := a.ModifyName()
    fmt.Printf("%s",name)
}

Playground Example

或者您可以传递一个接口,该接口将使用名称字段包装任何结构值,然后使用Type断言获取基础值以对其进行修改并返回结果:

package main

import (
    "fmt"
)

type MyIncredibleType struct {
    Name    string `json:"name"`  // ModifyName is not a type!
} 

func ModifyName(input interface{}) string{
        return input.(interface{}).(string)+".com"
}

func main() {
    a := MyIncredibleType{Name: "Abracadabra"}
    name := ModifyName(a.Name)
    fmt.Printf("%s",name)
}

Go Playground上工作的代码

有关更多信息,请参见Golang method Declarations,以了解如何创建接收方。