golang struct new 变量
时间: 2023-07-04 21:24:09 浏览: 65
在 Golang 中,我们可以使用 `new` 关键字来创建一个新的结构体变量。`new` 关键字返回一个指向新分配的零值结构体的指针。
以下是一个示例代码:
```go
type Person struct {
Name string
Age int
}
func main() {
p := new(Person)
p.Name = "John"
p.Age = 30
fmt.Println(*p) // Output: {John 30}
}
```
在上面的代码中,我们使用 `new` 关键字创建了一个指向 `Person` 结构体的指针 `p`。然后,我们可以使用 `p.Name` 和 `p.Age` 来访问结构体中的字段,并为其赋值。
最后,我们使用 `fmt.Println` 函数打印出结构体变量 `p` 的值,使用 `*p` 来解引用指针并访问结构体的具体值。输出结果为 `{John 30}`。
相关问题
golang new 和make区别
Golang中的new和make都是用来创建变量的内存空间的,但是它们的使用场景和功能略有不同。
new用于创建值类型(如int、float、struct等)的指针,它返回一个指向新分配的零值的指针。例如,当你需要一个指向某个类型的指针时,可以使用new。具体用法如下:
```
p := new(int)
```
上面的代码将创建一个int类型的指针p,并将它初始化为0。
make用于创建引用类型(如map、slice、channel等)的对象,它返回一个已初始化的(非零)对象。例如,当你需要创建一个切片时,可以使用make。具体用法如下:
```
s := make([]int, 0, 10)
```
上面的代码将创建一个长度为0、容量为10的int类型切片s。
因此,new和make的主要区别在于它们创建的变量类型不同,new创建指向零值的指针,而make创建已初始化的引用类型对象。
golang eval
在 Go 中,没有内置的 eval 函数。但是,您可以使用 Go 的 reflect 包来实现类似的功能。reflect 包允许您在运行时检查和操作变量、函数和结构体等。以下是一个简单的 eval 函数示例:
```go
package main
import (
"fmt"
"reflect"
)
func eval(str string) (int, error) {
// 创建一个新的空白结构体
var x struct{}
// 创建一个反射值对象
value := reflect.ValueOf(&x).Elem()
// 将表达式字符串解析为 Go 代码,并返回反射值对象
result, err := evalExpr(value, str)
if err != nil {
return 0, err
}
// 将反射值对象转换为 int 类型并返回
return int(result.Int()), nil
}
func evalExpr(value reflect.Value, expr string) (reflect.Value, error) {
// 创建一个新的解释器对象
interp := reflect.New(reflect.TypeOf(struct {
eval func(string) (int, error)
}{})).Elem()
// 将 eval 函数映射到解释器对象上
interp.FieldByName("eval").Set(reflect.ValueOf(eval))
// 将表达式字符串作为参数传递给解释器对象的 eval 函数
args := []reflect.Value{reflect.ValueOf(expr)}
results := interp.MethodByName("eval").Call(args)
// 返回解释器函数的结果
return results[0], nil
}
func main() {
result, err := eval("2 + 3 * 5")
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}
```
该示例中的 eval 函数将一个字符串表达式作为参数,并返回一个整数结果。它使用 evalExpr 函数将表达式字符串解析为 Go 代码,并使用反射包动态调用该代码。在 evalExpr 函数中,我们创建了一个解释器对象,并将 eval 函数映射到该对象上。然后,我们将表达式字符串作为参数传递给解释器对象的 eval 函数,并返回结果。