• 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
    ", 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()
    }
    

     

  • 相关阅读:
    IIS 和 各个协议
    Hibernate 框架基本知识
    各类主流框架及设计模式简介
    PHP微信公众开发笔记(七)
    PHP微信公众开发笔记(六)
    《Programming in Lua 3》读书笔记(二十七)
    《Programming in Lua 3》读书笔记(二十八)
    《Programming in Lua 3》读书笔记(二十六)
    PHP微信公众开发笔记(五)
    PHP微信公众开发笔记(四)
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7674144.html
Copyright © 2020-2023  润新知