package main
type Param map[string]interface{}
type Show struct {
*Param
}
func main() {
s := new(Show)
s.Param["RMB"] = 10000
}
map需要初始化后才能使用。
编译错误:invalid operation: s.Param["RMB"] (type *Param does not support indexing)
package main
import "fmt"
type student struct {
Name string
}
func zhoujielun(v interface{}) {
switch msg := v.(type) {
case *student, student:
msg.Name = "qq"
fmt.Print(msg)
}
}
msg不属于student类型,所以没有Name字段。
改为:
s := v.(student)
s.Name = "qq"
package main
import (
"encoding/json"
"fmt"
)
type People struct {
name string `json:"name"`
}
func main() {
js := `{
"name":"11"
}`
var p People
err := json.Unmarshal([]byte(js), &p)
if err != nil {
fmt.Println("err: ", err)
return
}
fmt.Println("people: ", p)
}
这道题坑很大,很多同学一看就以为是p
的初始化问题,实际上是因为name
首字母是小写,导致其他包不能访问,所以输出为空结构体。
改为:
type People struct {
Name string `json:"name"`
}
package main
func Stop(stop <-chan bool) {
close(stop)
}
有方向的channel不可被关闭
func main() {
lenth := 11
size := 5
list := make([]int, 0, lenth)
for i := 0; i < lenth; i++ {
list = append(list, i)
}
SpiltList(list, size)
}
func SpiltList(list []int, size int) {
lens := len(list)
mod := math.Ceil(float64(lens) / float64(size))
spliltList := make([][]int, 0)
for i := 0; i < int(mod); i++ {
tmpList := make([]int, 0, size)
fmt.Println("i=", i)
if i == int(mod)-1 {
tmpList = list[i*size:]
} else {
tmpList = list[i*size : i*size+size]
}
spliltList = append(spliltList, tmpList)
}
for i, sp := range spliltList {
fmt.Println(i, " ==> ", sp)
}
}
func ChannelFunc() {
zimu := make(chan int, 1)
suzi := make(chan int, 1)
zimu <- 0
// zimu
go func() {
for i := 65; i <= 90; i++ {
<-zimu
fmt.Printf("%v", string(rune(i)))
suzi <- i
}
return
}()
go func() {
for i := 1; i <= 26; i++ {
<-suzi
fmt.Printf("%v", i)
zimu <- i
}
return
}()
time.Sleep(1 * time.Second)
fmt.Println()
}
func Channel1Func() {
zimu := make(chan int)
suzi := make(chan int)
// zimu
go func() {
for i := 65; i <= 90; i++ {
fmt.Printf("%v", string(rune(i)))
zimu <- i
<-suzi
}
return
}()
go func() {
for i := 1; i <= 26; i++ {
<-zimu
fmt.Printf("%v", i)
suzi <- i
}
return
}()
time.Sleep(10 * time.Second)
fmt.Println()
}
大家可以自己实现,把结果留言给我,答案后续公布。
package main
// 47.执行下面代码输出什么?
import "fmt"
func main() {
five := []string{"Annie", "Betty", "Charley", "Doug", "Edward"}
for _, v := range five {
five = five[:2]
fmt.Printf("v[%s]\n", v)
}
}
循环内的切片值会缩减为2,但循环将在切片值的自身副本上进行操作。 这允许循环使用原始长度进行迭代而没有任何问题,因为后备数组仍然是完整的。
结果:
v[Annie]
v[Betty]
v[Charley]
v[Doug]
v[Edward]
package main
import "fmt"
func MutilParam(p ...interface{}) {
fmt.Println("MutilParam=", p)
}
func main() {
MutilParam("ssss", 1, 2, 3, 4) //[ssss 1 2 3 4]
iis := []int{1, 2, 3, 4}
MutilParam("ssss", iis) //输出MutilParam= [ssss [1 2 3 4]]如何做到输出为[ssss 1 2 3 4]
}
这样的情况会在开源类库如xorm升级版本后出现Exce函数不兼容的问题。
解决方式有两个:
tmpParams := make([]interface{}, 0, len(iis)+1)
tmpParams = append(tmpParams, "ssss")
for _, ii := range iis {
tmpParams = append(tmpParams, ii)
}
MutilParam(tmpParams...)
f := MutilParam
value := reflect.ValueOf(f)
pps := make([]reflect.Value, 0, len(iis)+1)
pps = append(pps, reflect.ValueOf("ssss"))
for _, ii := range iis {
pps = append(pps, reflect.ValueOf(ii))
}
value.Call(pps)
package main
// 50.编译并运行如下代码会发生什么?
import "fmt"
func main() {
mmap := make(map[map[string]string]int, 0)
mmap[map[string]string{"a": "a"}] = 1
mmap[map[string]string{"b": "b"}] = 1
mmap[map[string]string{"c": "c"}] = 1
fmt.Println(mmap)
}
golang中的map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还有 只包含前面几个类型的 interface types, structs, arrays。
显然,slice, map 还有 function 是不可以了,因为这几个没法用 ==
来判断,即不可比较类型。
可以将map[map[string]string]int
改为map[struct]int
。
原文:http://blog.51cto.com/qiangmzsx/2176019