golang一些知识点
2.冒泡排序(二维数组使用):
func main() { i := 1 MYLABEL: for { i++ if i > 3 { break MYLABEL } } fmt.Println("MYLABEL") } // Label名称随意,必需写在for循环前面
2.冒泡排序(数组使用):
func main() { var arr [6]int = [6]int{1, 9, 8, 500, 45, 2} arrSize := len(arr) for i := 0; i < arrSize; i++ { //fmt.Println(arr) for j := i; j < arrSize; j++ { if arr[i] < arr[j] { tmp := arr[i] arr[i] = arr[j] arr[j] = tmp } } } fmt.Println(arr) }
3.slice扩容引起的问题:
切片的数据结构:
slice在扩容会生成一个新的slice,再将原来的slice拷贝到新的slice,然后append.这将导致元素的地址发生变化.
示例:
func main() { slice := make([]int, 2, 5) slice[0] = 10 slice[1] = 20 fmt.Printf("%p\n", slice) slice = append(slice, 1, 2, 5, 6) fmt.Printf("%p", slice) }
因为有扩容,两次打印的slice数组的地址不一致.
slice作为函数参数时,传递了一个引用,我们append一个元素后,期望得到增加元素的slice,但事实上并没有:
func main() { slice := make([]int, 0) changeSlice(slice) fmt.Println(slice) } func changeSlice(slice []int) { slice = append(slice, 10) } // 输出: [],并没有增加元素这是因为切片扩容,导致了数组地址发生了变化.
所以应该将以上代码改为让其返回slice,并赋值:
func main() { slice := make([]int, 0) slice = changeSlice(slice) fmt.Println(slice) } func changeSlice(slice []int) []int { slice = append(slice, 10) return slice }
4.switch type的一个例子:
type Phone interface { Call() } type Android struct { name string } func (android *Android) Call() { fmt.Println(android.name) } func main() { android := &Android{name: "LG"} HangUp(android) } func HangUp(all Phone) { switch v := all.(type) { case *Android: fmt.Println("HangUp", v.name) default: fmt.Println("unknow device") } }
使用断言:
func HangUp(all Phone) { if a, ok := all.(*Android); ok { fmt.Println(a.name) return } fmt.Println("unknow device") }
5.fallthrough:
fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true
func main() { a := 1 switch a { case 1: fmt.Println("1") fallthrough case 2: fmt.Println("2") default: fmt.Println("no match") } } // 输出1 2, 第二个case并没有判断a是不是等于2
6.goroutine同步:sync
import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) wg := sync.WaitGroup{} wg.Add(10) for i := 0; i < 10; i++ { go work(&wg, i) } wg.Wait() } func work(wg *sync.WaitGroup, index int) { fmt.Println(index) wg.Done() }