相关疑难解决方法(0)

鸭子在Go中打字

我想编写一个Join带有String()方法的任意对象的函数:

package main

import (
    "fmt"
    "strings"
)

type myint int

func (i myint) String() string {
    return fmt.Sprintf("%d", i)
}

func main() {
    parts := []myint{myint(1), myint(5), myint(6)}
    fmt.Println(Join(parts, ", "))
}

func Join(parts []fmt.Stringer, sep string) string {
    stringParts := make([]string, len(parts))
    for i, part := range(parts) {
        stringParts [i] = part.String()
    }
    return strings.Join(stringParts , sep)
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/EhkbyibzHw

[]myint无法传递给Join,因为它不是类型fmt.Stringer,所以我必须写:

parts := []fmt.Stringer{myint(1), myint(5), myint(6)}
Run Code Online (Sandbox Code Playgroud)

但是如果我需要parts另一个值必须是整数的操作呢?我应该把一片切成myint …

duck-typing interface go

7
推荐指数
1
解决办法
2369
查看次数

使用分隔符打印结构中的字段列表

我有一个包含三个字段的类型

type Person struct {
    FirstName string
    LastName  string
    Age       int
}
Run Code Online (Sandbox Code Playgroud)

创建一个实例并使用默认fmt.Sprint()返回{John Smith 45}。但是对于我的用例,我需要一串 format John, Smith, 45。逗号分隔的列表,没有被大括号包围。有没有比以下更可重用和有效的方法:

fmt.Sprintf("%s, %s, %d", x.FirstName, x.LastName, x.Age)
Run Code Online (Sandbox Code Playgroud)

我将在其他类型中大量使用此方法,我更喜欢通用方法,而不必为我使用的每种类型输入格式:

func asFields(data interface{}) string {
    // TODO logic here
}
Run Code Online (Sandbox Code Playgroud)

string struct go

2
推荐指数
1
解决办法
281
查看次数

struct String()实现导致堆栈溢出Sprintf"+"标志

Golang noob问题:为什么我不能"%+v"在String()实现方法中使用该结构的标志?

我有一个结构,我想实现一个String()漂亮的打印方法.我喜欢这里给出的答案,但我不喜欢键入,所以我试图修改它以使用"%+v"结构的格式标志返回一个字符串.来自fmt doc:

%v打印结构时默认格式的值,加号标志(%+ v)添加字段名称

如果我简单地调用它,这可以正常工作fmt.Printf("%+v", color),但如果我尝试将+标志放在String()实现中,我会得到堆栈溢出(我第一次在stackoverflow.com上询问"堆栈溢出"问题;))

我确定我不理解这里的指针引用,或者有一些递归.我怀疑这个菜鸟找到了我的第一个Golang虫子,所以有人可以解释一下吗?

请参阅此处的播放演示https://play.golang.org/p/13_qI8Iwwa

go

1
推荐指数
1
解决办法
425
查看次数

标签 统计

go ×3

duck-typing ×1

interface ×1

string ×1

struct ×1