我在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代码时,我发现地图值不可寻址.例如,
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中无法实现(或故意未实现)相同的可寻址性,那将是很好的.
我有一本字典
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 ×3