Golang实现string,int,int64及float类型互相转换的方法

原创 2025-05-27 10:11:46编程技术
695

在 Go 语言开发中,类型转换是日常操作中不可或缺的一环。由于 Go 是静态类型语言,不同类型之间的转换需要显式声明,这既保证了类型安全,也要求开发者对类型系统有清晰认知。本文ZHANID工具网将系统讲解 stringintint64float 四大基础类型之间的转换方法,结合官方标准库和最佳实践,帮助开发者掌握类型转换的核心技巧。

一、string 与整数类型的互相转换

1. string → int/int64

核心方法:使用 strconv 包的 ParseIntAtoi 函数
适用场景:将数字字符串转换为整数类型

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // string → int
    strInt := "42"
    if num, err := strconv.Atoi(strInt); err == nil {
        fmt.Printf("Converted int: %d (Type: %T)\n", num, num) // 42 (int)
    } else {
        fmt.Println("Conversion error:", err)
    }

    // string → int64(指定进制和位大小)
    strInt64 := "1024"
    if num64, err := strconv.ParseInt(strInt64, 10, 64); err == nil {
        fmt.Printf("Converted int64: %d (Type: %T)\n", num64, num64) // 1024 (int64)
    }
}

关键参数说明

  • base: 进制(2-36),如 10 表示十进制

  • bitSize: 目标整数类型(0/8/16/32/64)

  • 返回值包含错误对象,必须进行错误检查

2. int/int64 → string

核心方法:使用 strconv 包的 ItoaFormatInt 函数
适用场景:将整数转换为十进制字符串表示

func main() {
    // int → string
    num := 42
    str := strconv.Itoa(num)
    fmt.Printf("Converted string: %s (Type: %T)\n", str, str) // "42" (string)

    // int64 → string(指定进制)
    num64 := int64(1024)
    str64 := strconv.FormatInt(num64, 16) // 转为16进制字符串
    fmt.Printf("Hex string: %s (Type: %T)\n", str64, str64) // "400" (string)
}

进制扩展

  • 二进制:base=2

  • 八进制:base=8

  • 十六进制:base=16(大写字母需额外处理)

golang.webp

二、string 与 float 类型的互相转换

1. string → float

核心方法:使用 strconv.ParseFloat 函数
适用场景:将浮点数字符串转换为 float32/float64

func main() {
    strFloat := "3.1415926"
    if f, err := strconv.ParseFloat(strFloat, 64); err == nil {
        fmt.Printf("Converted float64: %.7f (Type: %T)\n", f, f) // 3.1415926 (float64)
    }
}

精度控制

  • 第二个参数 bitSize 指定目标类型(32 或 64)

  • 转换时会保留原始精度,超出部分按四舍五入处理

2. float → string

核心方法:使用 strconv.FormatFloat 函数
适用场景:将浮点数转换为指定格式的字符串

func main() {
    f := 3.1415926
    // 格式化选项:'f'(定点表示法)、'e'(科学计数法)、'g'(自动选择)
    str := strconv.FormatFloat(f, 'f', 4, 64) // 保留4位小数
    fmt.Printf("Formatted string: %s (Type: %T)\n", str, str) // "3.1416" (string)
}

格式化参数详解

  • fmt: 格式标记(f/e/E/g/G)

  • prec: 精度(小数点后位数)

  • bitSize: 原始浮点数类型(32/64)

三、整数类型之间的转换

1. int ↔ int64

显式类型转换

var i int = 42
var i64 int64 = int64(i)  // int → int64
i = int(i64)               // int64 → int(注意可能的精度损失)

平台差异注意

  • 在 32 位系统:int 为 4 字节,int64 为 8 字节

  • 在 64 位系统:int 为 8 字节,与 int64 等价

2. int/int64 ↔ float

直接类型转换

var i int = 42
f := float64(i)  // int → float64
i = int(f)       // float64 → int(截断小数部分)

精度风险

  • 浮点数转整数会丢失小数部分

  • 大整数转浮点数可能丢失精度(超过 2^53 时)

四、类型转换的通用技巧

1. 错误处理最佳实践

// 统一错误处理函数
func safeConvert(s string) (int, error) {
    if num, err := strconv.Atoi(s); err != nil {
        return 0, fmt.Errorf("invalid integer: %q", s)
    }
    return num, nil
}

// 使用示例
if num, err := safeConvert("123a"); err != nil {
    fmt.Println("Error:", err) // 输出: invalid integer: "123a"
}

2. 性能优化建议

  • 优先使用 strconv 包:相比 fmt.Sprintfstrconv 方法性能更高

  • 避免重复转换:缓存常用转换结果

  • 批量处理优化:使用 strings.Builder 进行批量字符串操作

3. 边界值测试用例

// 测试用例推荐
testCases := []struct {
    input    string
    expected int64
}{
    {"0", 0},
    {"-2147483648", math.MinInt32},
    {"9223372036854775807", math.MaxInt64},
    {"18446744073709551616", 0}, // 超出int64范围
}

for _, tc := range testCases {
    if res, _ := strconv.ParseInt(tc.input, 10, 64); res != tc.expected {
        t.Errorf("Failed: %s → %d", tc.input, res)
    }
}

五、常见问题解决方案

1. 处理带符号的数字字符串

str := "-123.45"
if num, err := strconv.ParseFloat(str, 64); err == nil {
    // 自动处理正负号
}

2. 十六进制字符串转换

// 十六进制 → 整数
hexStr := "1a3f"
num, _ := strconv.ParseInt(hexStr, 16, 64) // 输出: 6719

// 整数 → 十六进制(大写)
str := strings.ToUpper(strconv.FormatInt(num, 16))

3. 科学计数法处理

// 科学计数法 → float
sciStr := "6.022e23"
f, _ := strconv.ParseFloat(sciStr, 64) // 输出: 6.022e+23

// float → 科学计数法
str := strconv.FormatFloat(f, 'e', 3, 64)

六、总结与最佳实践

  1. 显式优于隐式:所有类型转换必须显式声明

  2. 错误检查不可少:特别是从字符串转换时

  3. 优先使用标准库strconv 包经过充分优化

  4. 注意平台差异:int 类型在不同平台的字节数不同

  5. 性能敏感场景:避免使用 fmt.Sprintf 进行类型转换

掌握这些类型转换技巧,可以有效避免 Go 语言开发中 80% 的类型相关错误。建议在实际项目中封装常用的转换函数,并配合充分的单元测试,确保类型转换的健壮性。

Golang string int int64 float
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

以太坊layer2网络kinto将关闭:一场安全漏洞引发的行业警钟
攻击事件始末 7月10日那天,Kinto出大事了。这个以太坊Layer2网络被黑客盯上了。攻击者钻了合约漏洞的空子。他们伪造了11万枚Kinto代币。接着套现577个ETH,约合155万美元。...
2026-04-02 新闻资讯
277

Wintermute投资哪些币种?资深分析师揭秘真相
Wintermute不是传统投资方 说白了,Wintermute是做市商,不是风投公司。他们不“投资”币种像散户那样长期持有。这点很重要,很多人搞混了。他们靠提供流动性赚钱,简单说就...
2026-04-02 新闻资讯
172

TRUMP晚宴VIP席位前三公布:HTX钱包、Wintermute、MemeCore领跑
大家好,我是老K。币圈摸爬滚打七年,啥大风大浪没见过。但这次TRUMP晚宴的席位争夺,真让我直呼内行。你看,官方刚公布VIP前三名,瞬间引爆社区。说白了,这就是一场持币量...
2026-04-02 新闻资讯
135

point币不能交易?老韭菜亲历解析原因与自救指南
大家好,我是老K。混币圈7年了。最近后台炸了。粉丝狂问point币不能交易咋回事。我查了资料,这事挺严重。今天掏心窝子聊聊。别急,咱一步步说。 事件真相:POINT币突然停...
2026-04-02 新闻资讯
184

point币停止交易了吗
根据提供的权威信息源,我没有找到任何关于“point币”(通常指PointPay代币PNT)停止交易的官方公告或记录。在币安、OKX等主流交易所的近期下架通知中(如文档3、4、5所示)...
2026-04-02 新闻资讯
146

point币怎么提不了现了?老韭菜亲测避坑指南
Point币提不出钱?先别慌 最近好多粉丝私信问我point币提不了现的事。说实话,这事我见多了。七年前我也被坑过。当时gas war太猛,一笔交易卡了三天。钱包差点rekt。现在看...
2026-04-02 新闻资讯
113