转换指针值表达式

huangapple go评论109阅读模式
英文:

Casting pointer value expression

问题

我正在尝试弄清楚这个表达式的作用:

(*levelValue)(&level)

我不明白正在发生什么,它似乎首先对levelValue进行解引用,但是由于levelValue的类型是int32,所以不确定为什么要这样做。

一些上下文如下:

import "flag"

type Level int32
type levelValue Level

// LevelFlag定义了一个具有指定名称、默认值和用法字符串的Level标志。
// 返回值是存储标志值的Level值的地址。
func LevelFlag(name string, defaultLevel Level, usage string) *Level {
    level := defaultLevel
    flag.Var((*levelValue)(&level), name, usage)
    return &level
}

func (l *levelValue) Set(s string) error {
    return (*Level)(l).UnmarshalText([]byte(s))
}

func (l *levelValue) String() string {
    return (*Level)(l).String()
}

参考资料

英文:

I'm trying to figure out what this expression does:

(*levelValue)(&level)

I don't understand what is happening, it seems like it dereferencing levelValue first, but not sure why as the type of levelValue is int32

Some context below

import "flag"

type Level int32
type levelValue Level

// LevelFlag defines a Level flag with specified name, default value and
// usage string. The return value is the address of a Level value that stores
// the value of the flag.
func LevelFlag(name string, defaultLevel Level, usage string) *Level {
	level := defaultLevel
	flag.Var((*levelValue)(&level), name, usage)
	return &level
}

func (l *levelValue) Set(s string) error {
	return (*Level)(l).UnmarshalText([]byte(s))
}

func (l *levelValue) String() string {
	return (*Level)(l).String()
}

Reference

答案1

得分: 2

这是一种类型转换:

当你定义一个类型时,像这样:

type A B

你可以将类型为 B 的变量转换为类型 A,像这样:

b := B
a := A(b)

在你的情况下,类型 A(*levelValue)(括号是为了指定类型为指向 levelValue 的指针)。而变量 b&level(一个指向变量 level 的指针)。

英文:

This is a type conversion:

When you define a type like that

type A B

You can convert a variable of type B to type A like that:

b := B
a := A(b)

In your case, the type A is (*levelValue) (The parenthesis are needed to specify that the type is a pointer to a levelValue. And the variable b is &level (A pointer that points to the variable level)

huangapple
  • 本文由 发表于 2021年5月25日 20:58:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/67688447.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定