外国应用程序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
答案 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)
}
或者您可以传递一个接口,该接口将使用名称字段包装任何结构值,然后使用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,以了解如何创建接收方。