วิธีการแปลงค่า int เป็นสตริงใน Go?


486
i := 123
s := string(i) 

s คือ 'E' แต่สิ่งที่ฉันต้องการคือ "123"

กรุณาบอกฉันว่าฉันจะได้รับ "123"

และใน Java ฉันสามารถทำได้ด้วยวิธีนี้:

String s = "ab" + "c"  // s is "abc"

ฉันจะconcatสองสายใน Go ได้อย่างไร?


คำถามที่สอง (การต่อสตริง) มีคำตอบที่อื่นที่ครอบคลุมประสิทธิภาพ
RedGrittyBrick

คำตอบ:


772

ใช้ฟังก์ชั่นstrconvของแพ็คเกจItoa

ตัวอย่างเช่น:

package main

import (
    "strconv"
    "fmt"
)

func main() {
    t := strconv.Itoa(123)
    fmt.Println(t)
}

คุณสามารถเชื่อมสตริงได้ง่ายๆโดย+'ไอเอ็นจีพวกเขาหรือโดยใช้Joinฟังก์ชั่นของstringsแพคเกจ


97
ทำไมนักออกแบบภาษาจึงคิดว่าชื่อฟังก์ชั่นที่เป็นความลับอย่าง "Itoa" นั้นดีกว่าสำหรับบางสิ่งที่อาจอธิบายได้มากกว่านี้?
ลุค

25
@ ลุคมันมาจากมรดก C ซึ่งเครื่องทั้งหมดอาจมีหน่วยความจำ 256K; การใช้งานนั้นเสียสละเพื่อให้เหมาะสมกับฟังก์ชั่นการใช้งานมากขึ้นผู้สร้าง Go ล้วนฝังลึกอยู่ในมรดกและรู้สึกสบายใจกับชื่อเหล่านี้
ไบรอัน

117
การวางประวัติศาสตร์เหนือการเข้าถึงและความสะดวกในการเรียนรู้คือการออกแบบที่ไม่ดี IMO :(
ลุค

32
@Luke ขึ้นอยู่กับว่าผู้ใช้เป้าหมายของคุณคือใครและการประชุมนั้นแข็งแกร่งแค่ไหน บางคนยังคงมี UIs ฟล็อปปี้ดิสก์เป็นไอคอนบันทึก :)
Nathron

65
สำหรับชื่อที่จดจำง่ายItoA - จำนวนเต็มถึง ASCII
Ivan Aracki

139
fmt.Sprintf("%v",value);

ถ้าคุณรู้ว่าประเภทที่เฉพาะเจาะจงของค่าใช้จัดรูปแบบที่สอดคล้องกันตัวอย่างเช่น%dสำหรับint

ข้อมูลเพิ่มเติม - fmt


%dสำหรับ int - สิ่งนี้
scniro

4
ฉันจะไม่แนะนำสิ่งนี้เนื่องจากมันมีประสิทธิภาพน้อยกว่าวิธีการแปลงอื่น ๆ เพราะใช้การสะท้อน
Ricardo Souza

49

เป็นที่น่าสนใจที่จะทราบว่าstrconv.Itoaเป็นชวเลขสำหรับ

func FormatInt(i int64, base int) string

พร้อมฐาน 10

ตัวอย่างเช่น:

strconv.Itoa(123)

เทียบเท่ากับ

strconv.FormatInt(int64(123), 10)

ไม่ได้กำหนด: strconv ใน strconv.Itoa
Felo Vilches

1
@FeloVilches นำเข้า "strconv"
kgthegreat

3
น่าสนใจที่จะทราบว่าการเรียก FormatInt () โดยตรงแทน Itoa () จะช่วยประหยัด 0.1 นาโนวินาทีตามมาตรฐานที่stackoverflow.com/a/38077508/968244
isapir

43

fmt.Sprintf, strconv.Itoaและstrconv.FormatIntจะทำงาน แต่Sprintfจะใช้แพคเกจreflectและจะจัดสรรอีกหนึ่งวัตถุดังนั้นจึงไม่ใช่ตัวเลือกที่มีประสิทธิภาพ

ป้อนคำอธิบายรูปภาพที่นี่



22

ในกรณีนี้ทั้งสองstrconvและfmt.Sprintfทำงานเดียวกัน แต่ใช้ฟังก์ชั่นstrconvของแพคเกจItoaเป็นตัวเลือกที่ดีที่สุดเพราะfmt.Sprintfจัดสรรอีกหนึ่งวัตถุระหว่างการแปลง

ตรวจสอบผลลัพธ์ของทั้งคู่ ตรวจสอบมาตรฐานที่นี่: https://gist.github.com/evalphobia/caee1602969a640a4530

ดูhttps://play.golang.org/p/hlaz_rMa0Dตัวอย่างเช่น


1
@Boon มีผลกระทบต่อแอพของคุณหรือไม่ เช่นเคย - มันขึ้นอยู่กับ วัตถุอื่นหมายถึงวัตถุอีกหนึ่งชิ้นที่นอกเหนือจากหน่วยความจำขนาดเล็กที่เห็นได้ชัดจะต้องมีการรวบรวมขยะ หากคุณกำลังเรียกใช้ฟังก์ชันในอัตราที่สูงตัวอย่างเช่นเป็นส่วนหนึ่งของกระบวนการทำให้เป็นอนุกรมที่ใช้เมื่อใดก็ตามที่ได้รับข้อความจากที่ใดที่หนึ่งอาจส่งผลกระทบอย่างมีนัยสำคัญ เนื่องจากfmt.Sprintfและstrconv.iotaมีความคล้ายคลึงกันในแง่ของการใช้งานง่ายและข้อมูลข้างต้นแสดงให้เห็นว่าเล็กน้อยจะเร็วขึ้นโดยมีผลกระทบ GC ต่ำกว่าจึงปรากฏว่าiotaควรใช้โดยทั่วไปเมื่อจำนวนเต็มเดียวต้องแปลง
Edward

ดูเหมือนว่าการเพิ่มประสิทธิภาพก่อนวัยอันควรสำหรับฉันจะคิดในระดับนี้ในไม่ช้า ดีที่สุดคือการเขียนรหัสที่อ่านได้ก่อน
Boon

@Boon พวกเขาอ่านได้อย่างเท่าเทียมกัน อาจใช้อย่างใดอย่างหนึ่งได้เร็วขึ้น นอกจากนี้สิ่งที่จะพูดว่าโปรแกรมเมอร์ Golang ใหม่ไม่ได้เริ่มต้นด้วยสิ่งที่ทำ Conversion เหล่านี้มากมาย? ฉันเป็นโปรแกรมเมอร์ที่มีประสบการณ์ซึ่งเขียนโค้ด Golang ตัวแรกของฉันในตอนนี้และอยู่ในสถานการณ์นั้น
sudo


3

ตกลงส่วนใหญ่แสดงให้คุณเห็นสิ่งที่ดี เราให้สิ่งนี้กับคุณ:

// ToString Change arg to string
func ToString(arg interface{}, timeFormat ...string) string {
    if len(timeFormat) > 1 {
        log.SetFlags(log.Llongfile | log.LstdFlags)
        log.Println(errors.New(fmt.Sprintf("timeFormat's length should be one")))
    }
    var tmp = reflect.Indirect(reflect.ValueOf(arg)).Interface()
    switch v := tmp.(type) {
    case int:
        return strconv.Itoa(v)
    case int8:
        return strconv.FormatInt(int64(v), 10)
    case int16:
        return strconv.FormatInt(int64(v), 10)
    case int32:
        return strconv.FormatInt(int64(v), 10)
    case int64:
        return strconv.FormatInt(v, 10)
    case string:
        return v
    case float32:
        return strconv.FormatFloat(float64(v), 'f', -1, 32)
    case float64:
        return strconv.FormatFloat(v, 'f', -1, 64)
    case time.Time:
        if len(timeFormat) == 1 {
            return v.Format(timeFormat[0])
        }
        return v.Format("2006-01-02 15:04:05")
    case jsoncrack.Time:
        if len(timeFormat) == 1 {
            return v.Time().Format(timeFormat[0])
        }
        return v.Time().Format("2006-01-02 15:04:05")
    case fmt.Stringer:
        return v.String()
    case reflect.Value:
        return ToString(v.Interface(), timeFormat...)
    default:
        return ""
    }
}

0
package main

import (
    "fmt" 
    "strconv"
)

func main(){
//First question: how to get int string?

    intValue := 123
    // keeping it in separate variable : 
    strValue := strconv.Itoa(intValue) 
    fmt.Println(strValue)

//Second question: how to concat two strings?

    firstStr := "ab"
    secondStr := "c"
    s := firstStr + secondStr
    fmt.Println(s)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.