
go 语言中可通过直接赋值完成同类型、同长度字符串数组的拷贝,但数组长度必须严格一致,否则编译报错。
go 语言中可通过直接赋值完成同类型、同长度字符串数组的拷贝,但数组长度必须严格一致,否则编译报错。
在 Go 中,数组是值类型(value type),这意味着当使用 = 赋值时,整个数组的内容会被逐元素复制,而非共享底层内存。这一特性使得字符串数组的复制非常简洁高效——只要源数组与目标数组具有完全相同的类型(即相同长度和元素类型),即可通过一次赋值完成深拷贝。
✅ 正确示例:同长度数组赋值
package main
import "fmt"
func main() {
// 声明一个长度为 5 的空字符串数组
var array1 [5]string
// 声明并初始化另一个长度为 5 的字符串数组
array2 := [5]string{"A", "B", "C", "D", "E"}
// 直接赋值:完整复制所有元素
array1 = array2
fmt.Println("array1:", array1) // [A B C D E]
fmt.Println("array2:", array2) // [A B C D E]
// 修改 array1 不会影响 array2(验证值语义)
array1[0] = "X"
fmt.Println("after change, array1[0] =", array1[0]) // X
fmt.Println("array2[0] remains:", array2[0]) // A
}❌ 错误示例:长度不匹配导致编译失败
var array1 [4]string // 长度为 4
array2 := [5]string{"A","B","C","D","E"} // 长度为 5
array1 = array2 // 编译错误:cannot use array2 (type [5]string) as type [4]string in assignment⚠️ 注意事项:
- Go 数组的长度是其类型的一部分,[4]string 和 [5]string 是完全不同的类型,不可互相赋值;
- 若需灵活处理变长数据,建议改用切片([]string),配合 copy() 函数或 append() 实现安全复制;
- 对于大数组,虽赋值语义清晰,但需注意性能开销(整块内存复制);高频场景可结合 unsafe 或 reflect 优化(仅限高级用例,通常不推荐)。
✨ 小结
Go 的数组复制本质是值拷贝,语法简洁、语义明确。掌握「类型即长度」这一核心原则,即可避免绝大多数赋值错误。日常开发中若不确定长度,优先选用切片;若确定固定大小且追求内存布局可控(如序列化、系统编程),则数组赋值是最直接、最安全的复制方式。










