Go Walk教程 - 流程控制(for)

Go的控制逻辑 for ,即可以用来循环读取数据,又可以当作 while 来控制逻辑,还能迭代操作。

第一种,类似于C

sum := 0;
for index:=0; index < 10 ; index++ {
sum += index
}

第二种,for 配合 range 可以用于读取 slice 和 map 的数据,与一些语言的foreach类似:

for k,v:=range map {
fmt.Println("map's key:",k)
fmt.Println("map's val:",v)
}

第三种,控制逻辑,代替了while的功能

sum := 1
for sum < 1000 {
sum += sum
}

还有一个就是死循环,

i := 0
for {
if i > 10 {
break
}
fmt.Println(i)
i++
}

用 break 终止当前循环

break 和 continue

 break 操作是跳出当前循环, continue 是跳过本次循环继续下一个循环。

for i := 0 ; i < 10 ; i++ {
if i > 5 {
break ← 终止这个循环,只打印 0 到 5
}
println(i)
}

利子:

// Copyright 2012 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"log"
	"os"
	"strings"
)

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

func main() {
	mw := &MyMainWindow{model: NewEnvModel()}

	if _, err := (MainWindow{
		AssignTo: &mw.MainWindow,
		Title:    "Walk ListBox Example",
		MinSize:  Size{240, 320},
		Size:     Size{300, 400},
		Layout:   VBox{MarginsZero: true},
		Children: []Widget{
			VSplitter{
				Children: []Widget{
					ListBox{AssignTo: &mw.lb,Model:mw.model,OnCurrentIndexChanged: mw.lb_CurrentIndexChanged,OnItemActivated:mw.lb_ItemActivated,},
					TextEdit{AssignTo: &mw.te,ReadOnly: true,},
				},
			},
		},
	}.Run()); err != nil {
		log.Fatal(err)
	}
}

type MyMainWindow struct {
	*walk.MainWindow
	model *EnvModel
	lb    *walk.ListBox
	te    *walk.TextEdit
}

func (mw *MyMainWindow) lb_CurrentIndexChanged() {
	i := mw.lb.CurrentIndex()
	item := &mw.model.items[i]

	mw.te.SetText(item.value)

	fmt.Println("CurrentIndex: ", i)
	fmt.Println("CurrentEnvVarName: ", item.name)
}

func (mw *MyMainWindow) lb_ItemActivated() {
	value := mw.model.items[mw.lb.CurrentIndex()].value

	walk.MsgBox(mw, "Value", value, walk.MsgBoxIconInformation)
}

type EnvItem struct {
	name  string
	value string
}

type EnvModel struct {
	walk.ListModelBase
	items []EnvItem
}

func NewEnvModel() *EnvModel {
	env := os.Environ()

	m := &EnvModel{items: make([]EnvItem, len(env))}

	for i, e := range env {
		j := strings.Index(e, "=")
		if j == 0 {
			continue
		}
		name := e[0:j]
		value := strings.Replace(e[j+1:], ";", "\r\n", -1)

		m.items[i] = EnvItem{name, value}
	}

	return m
}

func (m *EnvModel) ItemCount() int {
	return len(m.items)
}

func (m *EnvModel) Value(index int) interface{} {
	return m.items[index].name
}

walk利子  

  

——

布局:

1、MainWindow

Layout:  

VBox{},垂直(vertical)

HBox{},水平(horizontal)

2、Splitter(分流器)

VSplitter,垂直(vertical)

HSplitter,水平(horizontal)

注:Layout作为MainWindow的一个属性,而VSplitter、HSplitter作为一个独立控件

3、Composite(组合),也是作为一个控件

他有一个Layout属性,

Layout:Grid{Row:3,Columns: 2}//三行二列的网状结构,如果是1行或1列可以省略Row或Columns

 

posted @ 2016-10-22 07:47  gobuild  阅读(3398)  评论(0编辑  收藏  举报