Làm cách nào để chuyển đổi một giá trị int thành chuỗi trong Go?


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

s là 'E', nhưng cái tôi muốn là "123"

Xin vui lòng cho tôi biết làm thế nào tôi có thể nhận được "123".

Và trong Java, tôi có thể làm theo cách này:

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

Làm thế nào tôi có thể concathai chuỗi trong Go?


Câu hỏi thứ hai (nối chuỗi) có một câu trả lời ở nơi khác bao gồm hiệu quả.
RedGrittyBrick

Câu trả lời:


772

Sử dụng chức năng strconvcủa gói Itoa.

Ví dụ:

package main

import (
    "strconv"
    "fmt"
)

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

Bạn có thể nối chuỗi đơn giản bằng +cách sử dụng chúng hoặc bằng cách sử dụng Joinchức năng của stringsgói.


97
Tại sao các nhà thiết kế ngôn ngữ nghĩ rằng các tên hàm mật mã như "Itoa" lại thích hợp với thứ gì đó có thể mô tả hơn một chút?
Lu-ca

25
@luke nó xuất phát từ di sản C nơi toàn bộ máy có thể có bộ nhớ 256K; khả năng sử dụng đã được hy sinh để phù hợp với nhiều chức năng hơn. Những người tạo ra Go đều được nhúng sâu vào di sản đó và cảm thấy hoàn toàn thoải mái với những cái tên này.
Bryan

117
Đặt lịch sử lên trên khả năng tiếp cận và dễ học là IMO thiết kế xấu. :(
Luke

32
@Luke Phụ thuộc vào người dùng mục tiêu của bạn là ai và quy ước đó mạnh đến mức nào. Một số UI vẫn có đĩa mềm là biểu tượng Lưu :)
Nathron

65
để dễ nhớ tên ItoA - Integer to ASCII
Ivan Aracki 22/2/18

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

Nếu bạn biết loại cụ thể của giá trị sử dụng định dạng tương ứng ví dụ %dchoint

Thêm thông tin - fmt


%dcho int - này
scniro

4
Tôi không khuyến nghị điều này, vì cách này kém hiệu quả hơn nhiều so với các phương thức chuyển đổi khác vì nó sử dụng sự phản chiếu.
Ricardo Souza

49

Thật thú vị khi lưu ý rằng strconv.Itoaviết tắt cho

func FormatInt(i int64, base int) string

với cơ sở 10

Ví dụ:

strconv.Itoa(123)

tương đương với

strconv.FormatInt(int64(123), 10)

không xác định: strconv trong strconv.Itoa
Felo Vilches

1
@FeloVilches nhập "strconv"
kgthegreat

3
Thật thú vị khi lưu ý rằng việc gọi FormatInt () trực tiếp thay vì Itoa () tiết kiệm 0,1 nano giây theo điểm chuẩn tại stackoverflow.com/a/38077508/968244
isapir 17/11/18

43

fmt.Sprintf, strconv.Itoastrconv.FormatIntsẽ làm công việc. Nhưng Sprintfsẽ sử dụng gói reflectvà nó sẽ phân bổ thêm một đối tượng, vì vậy đó không phải là một lựa chọn hiệu quả.

nhập mô tả hình ảnh ở đây



22

Trong trường hợp này cả hai strconvfmt.Sprintfthực hiện cùng một công việc nhưng sử dụng chức năng strconvcủa gói Itoalà lựa chọn tốt nhất, vì fmt.Sprintfphân bổ thêm một đối tượng trong quá trình chuyển đổi.

kiểm tra kết quả nenchmark của cả hai kiểm tra điểm chuẩn tại đây: https://gist.github.com/evalphobia/caee1602969a640a4530

xem https://play.golang.org/p/hlaz_rMa0D chẳng hạn.


1
@Boon Trong tác động có thể nhìn thấy đến ứng dụng của bạn? Như mọi khi - nó phụ thuộc. Một đối tượng khác có nghĩa là thêm một đối tượng, ngoài cú đánh bộ nhớ nhỏ tạm thời rõ ràng, cần phải được thu gom rác. Nếu bạn đang gọi hàm với tốc độ cao, ví dụ như một phần của quy trình tuần tự hóa được sử dụng bất cứ khi nào nhận được tin nhắn từ một nơi nào đó, nó có thể có tác động đáng kể. Vì fmt.Sprintfstrconv.iotatương tự nhau về tính dễ sử dụng và dữ liệu trên cho thấy iota nhanh hơn với tác động của GC thấp hơn, nên có vẻ như iotanên được sử dụng chung khi một số nguyên duy nhất cần chuyển đổi.
Edward

Có vẻ như tối ưu hóa sớm đối với tôi để sớm suy nghĩ ở cấp độ này. Tốt nhất là viết mã có thể đọc được trước.
Boon

@Boon Chúng dễ đọc như nhau. Cũng có thể sử dụng một trong những nhanh hơn. Ngoài ra, những gì để nói một lập trình viên Golang mới không bắt đầu với thứ gì đó thực hiện nhiều chuyển đổi này? Tôi là một lập trình viên có kinh nghiệm viết mã Golang đầu tiên của tôi ngay bây giờ và đang ở trong tình huống đó.
sudo

9

Chuyển đổi int64:

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

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

3

ok, hầu hết trong số họ đã cho bạn thấy một cái gì đó tốt. Hãy để bạn cung cấp cho bạn điều này:

// 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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.