毕业设计一周一记05
go语言遍历数组
使用range
func (this *ShopController) Get() {
this.TplName = "shop.html"
var classfies []*models.Classify
var err error
classfies, err = models.GetClassifyAll(1)
if err != nil {
beego.Error(err)
}
for classItem := range classfies {
classfies[classItem].Children, err = models.GetClassifyAll(classfies[classItem].Id)
fmt.Println("显示分类:")
fmt.Println(classItem)
}
this.Data["classfies"] = classfies
}
range遍历slice切片时返回值为int型数值,而不是切片类型的变量
问题二:
分类的结构设计选用方案:
type Classify struct { Id int Name string Father *Classify `orm:"rel(fk)"` Children []*Classify `orm:"reverse(many)"` }
自身和自身形成一对多关系映射,形成分类的多级分类
知识点:
chan通道
ch:=make(chan 数据类型)
ch <- 数值 //发送数值2给这个通道
x:=<-ch //从通道里读取值,并把读取的值赋值给x变量
<-ch //从通道里读取值,然后忽略
通道我们还可以使用内置的 close
函数关闭。
close(ch)
使用make
函数初始化的时候,只有一个参数,其实make
还可以有第二个参数,用于指定通道的大小。默认没有第二个参数的时候,通道的大小为0,这种通道也被成为无缓冲通道
ch := make(chan int, 3)
单向通道
定义单向通道也很简单,只需要在定义的时候,带上 <-
var send chan<- int //只能发送 var receive <-chan int //只能接收
知识点二:
go语言类型断言:
value, ok := em.(T)
其中em为interface{}类型 T是要断言的类型。
类型断言表示的意义是:em(类型为interface{})的变量是否可以改变为,真实类型是否为T.
em代表要判断的变量
T代表被判断的类型
value代表返回的值
ok代表em类型是否可以改变为T
知识点:
go语言net/http包中
type Response struct { Status string // e.g. "200 OK" StatusCode int // e.g. 200 Proto string // e.g. "HTTP/1.0" ProtoMajor int // e.g. 1 ProtoMinor int // e.g. 0 Header Header Body io.ReadCloser ContentLength int64 TransferEncoding []string Close bool Trailer Header // 用于获取本相应所发送的请求 // Request's Body is nil (having already been consumed). // 为客户机请求填充 Request *Request TLS *tls.ConnectionState }
知识点:
atomic
原子操作