小编Tan*_*arg的帖子

为什么我不能将类型的值赋给实现具有该类型的接收器类型指针的方法的接口?

我在Golang的世界2天大,并经历了巡回演出.我忍不住注意到一种特殊性,我似乎无法通过适当的推理来达成一致.

此代码运行完美:

package main
import (
    "fmt"
    "math"
)
type Vertex struct{
    X,Y float64
}
type Abser interface{
    Abs() float64
}
func (v Vertex) Abs() float64{ //method with value receiver argument
    return math.Sqrt(v.X*v.X+v.Y*v.Y)
}
func main(){
    var myVer Vertex = Vertex{3,4}
    var inter Abser
    inter = &myVer //assigning *Vertex type to inter
    fmt.Println(inter.Abs())
}
Run Code Online (Sandbox Code Playgroud)

同时,以下代码显示错误:

package main
import (
    "fmt"
    "math"
)
type Vertex struct{
    X,Y float64
}
type Abser interface{
    Abs() float64
}
func (v *Vertex) Abs() …
Run Code Online (Sandbox Code Playgroud)

go

7
推荐指数
1
解决办法
3202
查看次数

为什么地图值不可寻址?

在使用Go代码时,我发现地图值不可寻址.例如,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    var myptr *string = &mymap[1]
    fmt.Println(*myptr)
}
Run Code Online (Sandbox Code Playgroud)

生成错误

mapaddressable.go:7:不能取mymap的地址[1]

然而,代码,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    mystring := mymap[1]
    var myptr *string = &mystring
    fmt.Println(*myptr)
}
Run Code Online (Sandbox Code Playgroud)

工作得非常好.

为什么会这样?为什么Go开发人员选择使某些值无法解决?这是语言的缺点还是一个特征?

编辑:从C++背景来看,我不习惯这种not addressable似乎在Go中流行的趋势.例如,以下代码可以正常工作:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
    map<int,string> mymap;
    mymap[1] = "one";
    string *myptr = &mymap[1];
    cout<<*myptr;
}
Run Code Online (Sandbox Code Playgroud)

如果有人能指出为什么在Go中无法实现(或故意未实现)相同的可寻址性,那将是很好的.

go

7
推荐指数
1
解决办法
1080
查看次数

go - 检查一张地图的键是否存在于另一张地图中

我有一本字典

a = {1:11, 2:22}
Run Code Online (Sandbox Code Playgroud)

我要检查,如果键b存在于a或不

b = {3:33, 1:11}
Run Code Online (Sandbox Code Playgroud)

我怎样才能用 Go 语言做到这一点?

我是这样做的:

a:= make(map[string][]string)
a["1"] = append(a["1"], "11")
a["1"] = append(a["1"], "22")
Run Code Online (Sandbox Code Playgroud)

我有一个字典b

b:= make(map[string]string)
b["1"] = "11"
Run Code Online (Sandbox Code Playgroud)

我该如何检查?本质上,我想检查 key 1fromb是否存在a

go

0
推荐指数
1
解决办法
1万
查看次数

标签 统计

go ×3