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
    }
}

但反射有性能开销且类型不安全,常规情况应使用点号操作符。

回到顶部