4 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
循環(huán)遍歷字符串字段并收集非空字符串。加入田野。
func (e *Employee) String() string {
? ? var parts []string
? ? for _, s := range []string{e.Name, e.Designation, e.Department, e.Email} {
? ? ? ? if strings.TrimSpace(s) != "" {
? ? ? ? ? ? parts = append(parts, s)
? ? ? ? }
? ? }
? ? return strings.Join(parts, " ")
}
由于 strings.Join 函數(shù)是使用 strings.Builder 實(shí)現(xiàn)的,因此將 strings.Join 替換為使用 strings.Builder 的應(yīng)用程序代碼沒有任何好處。
以下是如何使用 Reflect 來(lái)避免列出字符串函數(shù)中的字段:
var stringType = reflect.TypeOf("")
func (e *Employee) String() string {
? ? v := reflect.ValueOf(e).Elem()
? ? var parts []string
? ? for i := 0; i < v.NumField(); i++ {
? ? ? ? f := v.Field(i)
? ? ? ? if f.Type() == stringType {
? ? ? ? ? ? s := f.String()
? ? ? ? ? ? if strings.TrimSpace(s) != "" {
? ? ? ? ? ? ? ? parts = append(parts, s)
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return strings.Join(parts, " ")
}
如果你想包含所有字段(包括非字符串和空字符串),那么你可以fmt.Sprint(e)獲取一個(gè)字符串。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
我認(rèn)為您會(huì)想使用 Stringer 接口。IE:
package main
import (
"fmt"
"strings"
"strconv"
)
type Employee struct {
Name string
Designation string
Department string
Salary int
Email string
}
func main() {
emp1:=Employee{Name:"Cetin", Department:"MS", Salary:50}
emp2:=Employee{Name:"David", Designation:"Designation", Email:"david@nowhere.com"}
emp3:=Employee{Department:"Space", Salary:10}
fmt.Println(emp1)
fmt.Println(emp2)
fmt.Println(emp3)
}
func (e Employee) String() string {
var salary string
if e.Salary > 0 {
salary = strconv.Itoa(e.Salary) + " "
} else {
salary = ""
}
return strings.TrimSpace(
strings.TrimSpace(
strings.TrimSpace(e.Name + " " + e.Designation) + " " +
e.Department) + " " +
salary +
e.Email)
}
游樂場(chǎng):https://play.golang.org/p/L8ft7SeXpqt
PS:我后來(lái)注意到你只想要字符串字段,但無(wú)論如何都沒有刪除工資。

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以通過(guò)編寫一個(gè)實(shí)用函數(shù)來(lái)通過(guò)“非空白字符串”檢查進(jìn)行添加來(lái)使其不那么冗長(zhǎng)。
另外,您可以讓您的類型實(shí)現(xiàn)一個(gè)String()方法,該方法的優(yōu)點(diǎn)是在fmt打印函數(shù)中使用時(shí)可以按照您的意愿進(jìn)行打印。
此addToString函數(shù)是通用的,因此如果對(duì)其他類型執(zhí)行此操作,您可以重用它:
func addToString(original string, addition interface{}) string {
additionStr := fmt.Sprint(addition)
if additionStr != "" {
if original != "" {
original += " "
}
original += additionStr
}
return original
}
然后你可以像這樣實(shí)現(xiàn)它,這不是那么冗長(zhǎng):
type Employee struct {
Name string
Designation string
Department string
Salary int
Email string
}
func (e *Employee) String() string {
theString := ""
theString = addToString(theString, e.Name)
theString = addToString(theString, e.Designation)
theString = addToString(theString, e.Department)
theString = addToString(theString, e.Salary)
theString = addToString(theString, e.Email)
return theString
}
并像這樣使用它:
func main() {
emp := &Employee{
Name: "Jonh",
Department: "Some dept",
}
fmt.Println(emp.String())
fmt.Println(emp)
}
這將輸出:
Jonh Some dept 0
Jonh Some dept 0

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
封裝 fmt
import?"fmt"類型縱梁
Stringer 由具有 String 方法的任何值實(shí)現(xiàn),該方法定義該值的“本機(jī)”格式。String 方法用于將作為操作數(shù)傳遞的值打印到任何接受字符串的格式或打印到未格式化的打印機(jī)(例如 Print)。
type?Stringer?interface?{ ????????String()?string}
String
為 type編寫一個(gè)方法Employee
。
例如,
package main
import (
? ? "fmt"
? ? "strings"
)
type Employee struct {
? ? Name? ? ? ? string
? ? Designation string
? ? Department? string
? ? Salary? ? ? int
? ? Email? ? ? ?string
}
func appendItem(items *strings.Builder, item string) {
? ? if len(item) > 0 {
? ? ? ? if items.Len() > 0 {
? ? ? ? ? ? items.WriteByte(' ')
? ? ? ? }
? ? ? ? items.WriteString(item)
? ? }
}
func (e Employee) String() string {
? ? s := new(strings.Builder)
? ? appendItem(s, e.Name)
? ? appendItem(s, e.Designation)
? ? appendItem(s, e.Department)
? ? appendItem(s, e.Email)
? ? return s.String()
}
func main() {
? ? ee := Employee{
? ? ? ? Name:? ? ? ? "John Smith",
? ? ? ? Designation: "Manager",
? ? ? ? Department:? "Sales",
? ? ? ? Email:? ? ? ?"john.smith@example.com",
? ? ? ? Salary:? ? ? 42000,
? ? }
? ? fmt.Println(ee)
}
游樂場(chǎng):https://play.golang.org/p/EPBjgi8usJ-
輸出:
John?Smith?Manager?Sales?john.smith@example.com
我想將字符串字段連接成一種員工描述。
有沒有一種方法可以以反射方式迭代結(jié)構(gòu)體的所有字段并將它們連接起來(lái)?
迭代結(jié)構(gòu)體的所有字段具有與SELECT * ?FROM table;
SQL 中相同的錯(cuò)誤。返回的值是在運(yùn)行時(shí)而不是編譯時(shí)確定的。
如果您的情況,業(yè)務(wù)要求是隱藏機(jī)密字段,例如工資,并將顯示的字段限制為幾個(gè)關(guān)鍵的描述性字段。不可避免地,字段將被添加到結(jié)構(gòu)中。“連接字符串字段”規(guī)范現(xiàn)在或?qū)?lái)不太可能是正確的。
- 4 回答
- 0 關(guān)注
- 257 瀏覽
添加回答
舉報(bào)