英文:
Assign to anonymous struct value in map
问题
我正在使用go 1.3。
我如何访问map的匿名结构ValueType的字段?
package main
import "fmt"
type Words map[string]struct{
    pos   int
    n     int
}
func main() {
    w := make(Words)
    w["abc"].pos = 5 // 无法赋值
    fmt.Println(w)
}
英文:
I am using go 1.3.
How can I access the fields of the anonymous struct ValueType of the map ?
package main
import "fmt"
    
type Words map[string]struct{
    pos   int
    n     int
}
func main() {
    w := make(Words)
    w["abc"].pos = 5 // cannot assign
    
    fmt.Println(w)
}
答案1
得分: 9
例如,
package main
import "fmt"
type Words map[string]struct {
    pos int
    n   int
}
func main() {
    w := make(Words)
    v := w["abc"]
    v.pos = 5
    v.n = 42
    w["abc"] = v
    fmt.Println(w)
}
输出:
map[abc:{5 42}]
英文:
For example,
package main
import "fmt"
type Words map[string]struct {
	pos int
	n   int
}
func main() {
	w := make(Words)
	v := w["abc"]
	v.pos = 5
	v.n = 42
	w["abc"] = v
	fmt.Println(w)
}
Output:
map[abc:{5 42}]
答案2
得分: 2
你需要将一个值(你的结构体)分配给你的键:
type S struct {
    pos int
    n   int
}
type Words map[string]S
func main() {
    w := make(Words)
    s := S{pos: 1, n: 2}
    w["abc"] = s 
    fmt.Println(w)
}
在这个kbd示例中查看。
输出:
map[abc:{1 2}]
在"Go maps in action"中了解更多信息。
然后你可以检索你的值并进行分配:
sbis := w["abc"]
sbis.pos = 11
fmt.Println(sbis)
输出:
{11 2}
OneOfOne在他的示例中提出了一个getter函数,以便更快地分配pos,但如果需要,创建正确的值(即结构体的实例):
func (w Words) get(s string) (p *ps) {
    if p = w[s]; p == nil {
        p = &ps{}
        w[s] = p
    }
    return
}
这样就可以实现:
w := Words{}
w.get("abc").pos = 10
英文:
You need to assign a value (your struct) to your key:
type S struct {
	pos int
	n   int
}
type Words map[string]S
func main() {
	w := make(Words)
	s := S{pos: 1, n: 2}
	w["abc"] = s 
	fmt.Println(w)
}
See this <kbd>play.golang.org</kbd> example.
Output:
map[abc:{1 2}]
See more at "Go maps in action".
Then you can retrieve your value and assign:
sbis := w["abc"]
sbis.pos = 11
fmt.Println(sbis)
Output:
{11 2}
In his example, OneOfOne proposes a getter in order to assign pos quicker, but creating if needed the right value (that is an instance of the struct):
func (w Words) get(s string) (p *ps) {
	if p = w展开收缩; p == nil {
		p = &ps{}
		w展开收缩 = p
	}
	return
}
That allows:
w := Words{}
w.get("abc").pos = 10
答案3
得分: 1
你可以通过以下方式设置键的值。
package main
import "fmt"
func main() {
    w := make(map[string]struct {
        pos int
        n   int
    })
    w["abc"] = struct {
        pos int
        n   int
    }{
        pos: 5,
    }
    fmt.Println(w)
}
读取键的值更简单。
fmt.Println(w["abc"].pos)
英文:
You can set the value for a key this way.
package main
import "fmt"
func main() {
	w := make(map[string]struct {
		pos int
		n   int
	})
	w["abc"] = struct {
		pos int
		n   int
	}{
		pos: 5,
	}
	fmt.Println(w)
}
Reading the value for a key is easier.
fmt.Println(w["abc"].pos)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论