Golang中如何访问结构体字段
Golang中如何访问结构体字段 你好!请帮帮我
type employee struct {
name string
age int
salary int
address address
}
emp := employee{name: "Sam", age: 31, salary: 2000, address: address}
我能否像 emp["name"] 这样获取 employee 的值,还是只能使用 emp.name?
2 回复
只能作为 emp.name。有方法可以让 emp["name"] 生效,但这需要更多代码、努力、设置等……这取决于你为什么希望 emp["name"] 能生效。
更多关于Golang中如何访问结构体字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,结构体字段只能通过点号.操作符访问,不能像emp["name"]这样使用字符串索引。以下是正确的访问方式:
package main
import "fmt"
type address struct {
city string
country string
}
type employee struct {
name string
age int
salary int
address address
}
func main() {
addr := address{city: "London", country: "UK"}
emp := employee{
name: "Sam",
age: 31,
salary: 2000,
address: addr,
}
// 正确:使用点号访问字段
fmt.Println(emp.name) // 输出: Sam
fmt.Println(emp.age) // 输出: 31
fmt.Println(emp.salary) // 输出: 2000
fmt.Println(emp.address.city) // 输出: London
// 嵌套结构体访问
emp.address.country = "United Kingdom"
fmt.Println(emp.address.country) // 输出: United Kingdom
// 修改字段值
emp.age = 32
fmt.Println(emp.age) // 输出: 32
// 指针访问
empPtr := &emp
fmt.Println(empPtr.name) // 输出: Sam
fmt.Println((*empPtr).name) // 输出: Sam
}
如果需要通过字符串动态访问字段,可以使用反射(reflect包):
package main
import (
"fmt"
"reflect"
)
func main() {
addr := address{city: "London", country: "UK"}
emp := employee{
name: "Sam",
age: 31,
salary: 2000,
address: addr,
}
v := reflect.ValueOf(emp)
// 通过字段名获取值
nameField := v.FieldByName("name")
if nameField.IsValid() {
fmt.Println(nameField.String()) // 输出: Sam
}
ageField := v.FieldByName("age")
if ageField.IsValid() {
fmt.Println(ageField.Int()) // 输出: 31
}
}
但反射有性能开销且类型不安全,常规情况应使用点号操作符。

