<p>I want to create a mapping between strings and types, so an instance of a proper type is created depending on an input.</p>
<p>Something like this, but obviously more scalable: <a href="https://play.golang.org/p/52TWcVMNyO" rel="nofollow">https://play.golang.org/p/52TWcVMNyO</a></p>
<p>What is the idiomatic way of doing this?</p>
<hr/>**评论:**<br/><br/>sleepydog: <pre><p>I am going to take your example as being close to what you want to do, because it's very hard to answer such a general question. I would create an interface that captures what information I actually want to use these various types for. For instance, we can derive lat/long from both named locations and coordinates, so I would make those two types implement the following interface:</p>
<pre><code>type Location interface {
Coord() (lat, long float32)
}
</code></pre>
<p>and then your snippet in main() could go in a function, parseLocation, that returns a Location.</p>
<p>If you want examples in the standard library, look for parsing code. For example, look at the types in the go/ast package and how they're returned from the go/parser package, or the Token type in the encoding/xml package.</p></pre>nsd433: <pre><p>I'd use a <code>map[string]reflect.Type</code> and <code>reflect.New()</code> or <code>reflect.Zero()</code> to construct the types. However after that you have to set the fields, no? So to avoid needing more reflection, I'd have each type implement an interface which takes the input arguments and parses them out.</p></pre>nsd433: <pre><p>Something like <a href="https://play.golang.org/p/k4Cf-Dx-_9" rel="nofollow">https://play.golang.org/p/k4Cf-Dx-_9</a></p></pre>jaksi7c8: <pre><blockquote>
<p>However after that you have to set the fields, no?</p>
</blockquote>
<p>It's for parsing SSH requests, which is always done by <a href="https://godoc.org/golang.org/x/crypto/ssh#Unmarshal" rel="nofollow">ssh.Unmarshal</a>. It expects a variable of a struct type used to represent the value encoded in the payload. For example, a <code>pty-req</code> request includes the terminal type, width, height, while the <code>tcpip-forward</code> request includes a hostname and a port.</p></pre>nsd433: <pre><blockquote>
<p>parsing SSH requests</p>
</blockquote>
<p>I see. So you have no need for anything beyond a reflect.New() of the proper type, which make things even simpler.</p></pre>whizack: <pre><p><a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern" rel="nofollow">https://en.wikipedia.org/wiki/Abstract_factory_pattern</a></p></pre>
![](https://static.golangjob.cn/static/img/banner.png)