Golang中的常用转换

int/string互转

1
2
3
4
5
6

str := strconv.Itoa(19930217) // "19930217"


i,err := strconv.Atoi("19930217") //19930217


int64/string直接互转

1
2
3
str := strconv.FormatInt(9223372036854775808,10) //"9223372036854775808"

i64, err := strconv.ParseInt("9223372036854775808", 10, 64) //9223372036854775808

string和float32/64 互转

1
2
f64,err := strconv.ParseFloat("3.12345678",64) //3.12345678
f32,err := strconv.ParseFloat("3.12345678",32) //3.1234567165374756

1
2
3
4
5
   s1 := strconv.FormatFloat(3.12345678, 'f', -1, 32)//float32,3.1234567
s2 := strconv.FormatFloat(3.12345678, 'f', -1, 64)//float64,3.12345678

s3 := strconv.FormatFloat(3.1234567, 'f', -1, 32)//float32,3.1234567
s4 := strconv.FormatFloat(3.1234567, 'f', -1, 64)//float64,3.1234567

202050526

golang 具有相同字段的两个结构体类型可以相互转换 是否正确?举例说明

这个说法不完全正确。让我详细解释并举例说明:

准确的答案

不完全正确。Go语言中具有相同字段的两个结构体类型:

  1. 不能直接赋值转换(会编译错误)
  2. 可以显式类型转换(如果底层结构相同)
  3. 需要满足特定条件

详细规则

1. 显式转换的条件

两个结构体可以相互转换,当且仅当:

  • 字段名称、类型、顺序完全相同
  • 标签(tag)可以不同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type A struct {
Name string
Age int
}

type B struct {
Name string
Age int
}

// ✅ 可以显式转换
a := A{Name: "test", Age: 20}
b := B(a) // 显式转换成功

// ❌ 不能直接赋值
// var b B = a // 编译错误

2. 不能转换的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
// 字段顺序不同
type C struct {
Age int
Name string
}
// C和A不能相互转换

// 字段名不同
type D struct {
FullName string
Age int
}
// D和A不能相互转换

3. 特殊情况

匿名结构体可以直接赋值:

1
2
3
4
5
6
7
8
9
type Person struct {
Name string
Age int
}

var p Person = struct {
Name string
Age int
}{Name: "Alice", Age: 30} // ✅ 可以直接赋值

总结

  • 相同字段的不同结构体类型是不同的类型
  • 可以进行显式类型转换,但不能直接赋值
  • 转换需要字段名称、类型、顺序完全匹配
  • 这是Go语言类型安全设计的体现