第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何連接結(jié)構(gòu)體的字符串字段而忽略空字符串?

如何連接結(jié)構(gòu)體的字符串字段而忽略空字符串?

Go
RISEBY 2023-07-04 17:04:33
我對(duì) Go 很陌生,所以需要一些建議。我有一個(gè)結(jié)構(gòu):type Employee struct {    Name        string    Designation string    Department  string    Salary      int    Email       string}我想將字符串字段連接成一種員工描述。這樣,我可以說(shuō): toString(employee) 并得到:John Smith Manager Sales john.smith@example.com我嘗試獲取每個(gè)字段,檢查它們是否為空并將它們放入切片中并在最后加入它們employeeDescArr := make([]string, 0, 4)if strings.TrimSpace(value) != "" {    append(employee.GetName(), value)}...return strings.Join(employeeDescArr[:], " ")我認(rèn)為這個(gè)方法非常冗長(zhǎng)并且缺乏 Go 技巧。使用字符串生成器是否更好?有沒有一種方法可以以反射方式迭代結(jié)構(gòu)體的所有字段并將它們連接起來(lái)?
查看完整描述

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è)字符串。


查看完整回答
反對(duì) 回復(fù) 2023-07-04
?
三國(guó)紛爭(zhēng)

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ú)論如何都沒有刪除工資。


查看完整回答
反對(duì) 回復(fù) 2023-07-04
?
一只萌萌小番薯

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


查看完整回答
反對(duì) 回復(fù) 2023-07-04
?
有只小跳蛙

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)不太可能是正確的。


查看完整回答
反對(duì) 回復(fù) 2023-07-04
  • 4 回答
  • 0 關(guān)注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)