Як перетворити значення 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
@luke, це походить із спадщини C, де вся машина може мати 256K пам'яті; юзабіліті було принесено в жертву більше функціональності. Творці Go всі глибоко вкладені в цю спадщину і цілком комфортно почуваються з цими іменами.
Брайан

117
Розміщення історії над доступністю та простотою навчання - це поганий дизайн ІМО. :(
Лука

32
@Luke Залежить від того, хто є вашими цільовими користувачами та наскільки сильна умова. У деяких інтерфейсах все ще є дискета як значок Save :)
Nathron

65
для легкого запам’ятовування імені ItoA - Цілість до ASCII
Іван Арацький

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

Якщо ви знаєте конкретний тип значення, використовуйте відповідний формат, наприклад %dдляint

Більше інформації - fmt


%dfor int - this
scniro

4
Я б не рекомендував цього, оскільки це набагато менш ефективно, ніж інші методи перетворення, оскільки він використовує відображення.
Рікардо Соуза

49

Цікаво відзначити , що strconv.Itoaце стенографія для

func FormatInt(i int64, base int) string

з основою 10

Наприклад:

strconv.Itoa(123)

еквівалентно

strconv.FormatInt(int64(123), 10)

undefined: strconv in 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слід використовувати в цілому, коли для цілого цілого числа потрібно перетворити.
Едвард

Мені здається, що передчасна оптимізація мені так швидко думати на цьому рівні. Найкраще спочатку написати читабельний код.
Бун

@Boon Вони однаково читаються. Можна також скористатися швидшим. Крім того, що сказати, новий програміст Golang не починає з того, що робить багато цих перетворень? Я досвідчений програміст, який пише свій перший код Golang саме зараз, і знаходжусь у цій ситуації.
SUDO

9

Перетворення int64:

n := int64(32)
str := strconv.FormatInt(n, 10)

fmt.Println(str)
// Prints "32"

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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.