func (){ jsonstr:=[]byte(`{"age":1}`) var value map[string]interface{} json.unmarshal(jsonstr,&value) age:=value["age"] fmt.println(reflect.typeof(age)) //float64 }
import ( "sync" "fmt" ) type userages struct { ages map[string] int sync.mutex } func (u *userages)add(name string,age int) { u.lock() defer u.unlock() u.ages[name] = age } func (u *userages)get(name string)int{ if age,ok:=u.ages[name];ok{ return age } return -1 }
问题在于,ages没有暴露背外部的包,导致调用者无法初始化ages。然后在调用add函数时,就会报错。考察函数的作用域问题。
func testarrayandslice(){ s1:=[]int{1,2,3} s2:=s1[1:] for i:=range s2{ s2[i]+=10 } fmt.println(s2) s2=append(s2, 4) for i:=range s2{ s2[i]+=10 } fmt.println(s2) }
输出结果如下:这个是在考察数组和切片用s2截取s1的下边为1及之后;而后执行操作。
[12 13]
[22 23 14]
func testdoit(){ doit:= func(arg int) interface{}{ var result *struct{}=nil if (arg>0) { result = &struct{}{} } return result } //输出结果。 //-1:result: <nil> 为空的匿名结构体 //1://result: &{} 匿名结构体的地址 if res:=doit(1);res!=nil{ fmt.println("result:",res) } }
//放在main里边 //指定只能用一个逻辑处理器,方便看调度顺序。 runtime.gomaxprocs(1) wg:=sync.waitgroup{} wg.add(20) for i:=0;i<10 ;i++ { go func() { fmt.println("i",i) wg.done() }() } for i:=0;i<10 ;i++ { go func(i int) { fmt.println("j",i) wg.done() }(i) } wg.wait() /* j 9 i 10 i 10 i 10 i 10 i 10 i 10 i 10 i 10 i 10 i 10 j 0 j 1 j 2 j 3 j 4 j 5 j 6 j 7 j 8 */
这个要注意,第一个for里没有传参数,第二个传参数了。所以第一个for里启动的goroutine用的i其实是主线程里的i;之所以都是10,(也有可能前面几个<10);是因为调用i的时候,i在主线程内已经加到10了。而第二个for里的i是通过参数传递,所以会打印0~9;
至于为什么会先打印j,9;希望有大神来回答下。
如对本文有疑问, 点击进行留言回复!!
网友评论