zoukankan      html  css  js  c++  java
  • Golang

    声明变量,创建方法,传递参数

    package main
    
    import (
    	"fmt"
    	"math/rand"
    	"strconv"
    )
    
    var luckCount int
    
    func main() {
    	var count int
    	var err error
    	count, err = strconv.Atoi("314")
    	if err == nil {
    		fmt.Println("not found error", " count=", count)
    	} else {
    		fmt.Println("error has been happened", "count=", count)
    	}
    
    	for i := 50; i >= 0; i-- {
    		var num int = rand.Int()
    		var lucknum string = getLuck(num)
    		fmt.Println("num=", num)
    		fmt.Println(lucknum)
    	}
    	fmt.Println("幸运次数 = ", luckCount)
    	fmt.Println("不幸次数 = ", 50-luckCount)
    }
    func getLuck(a int) string {
    	if a%2 == 0 {
    		luckCount++
    		return "have good luck"
    	}
    	return "not very well"
    }
    
    

    把函数赋给变量(类似函数指针,C#中的delegate)

    package main
    
    import (
    	"fmt"
    )
    type mytype string
    func main(){
    	//type myString string
    	//var str myString = "new string type"
    	var str mytype
    	fc:=str.getString
    	var s string = fc()
    	fmt.Println(s)
    }
    func (s mytype) getString() string{
    	return "hahahha"
    }
    

    定义函数类型:
    有助于精简和明确调用者代码

    //声明函数类型的
    package main
    
    import (
    	"fmt"
    )
    
    type myType string
    
    func main(){
    var mt myType 
    
    str:=mt.getString(restring)
    fmt.Println(str)
    	
    }
    type fc func() string
    func(myType) getString(s fc) myType{
    return myType(s())
    }
    func restring () string {
    	return "i am a good boy"
    }
    

    匿名函数:go里也称为函数字面值

    //函数字面值(匿名函数)
    package main
    
    import (
    	"fmt"
    )
    
    var fc = func(){fmt.Println("hello")}
    func main(){
    	fc()
    }
    

    另一种常用的匿名方法

    //函数字面值(匿名函数)
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	func() { fmt.Println("hello") }()
          //加()立即执行
    }
    
    

    数组

    //函数字面值(匿名函数)
    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var array[10] int
    	array[9]=314
    	fmt.Println(array[9])
    
    	//或者符合字面值数组初始化器
    
    	array2:=[10] int{0,1,2,3,4,5,6,7,8,9}
    	fmt.Println(array2[9])
    
            	//遍历
    	array2:=[10] int{0,1,2,3,4,5,6,7,8,9}
    	for i,array:= range array2{
    		fmt.Println(i,array)
    	}
    }
    

    map(键值对)

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    
      var mymap = map[string]int{
    		"ms": 25,
    		"小花": 5,
    	}
    	fmt.Println(mymap["ms"])
    }
    

    使用map查询字符串中字母的个数

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var str string = "asdhfklaskdfhalskjdhflaksjdhfiusyfoishdflkwjhflksjhdflkasjhdflksjhfdlkjashdflkasjhdf"
      	var mymap = make(map[string]int)
    	for _,s:= range str{
    		mymap[string(s)]++
    	}
    	fmt.Println(mymap)
      
    }
    

    方法转发(Struct接收,或者Struct里面的struct接收)

    package main
    
    import (
    	"fmt"
    )
    
    type myStruct struct {
    	m2 myStruct2
    }
    
    type myStruct2 struct {
    	name string
    	age  int
    }
    
    func main() {
    
    	var myS myStruct
    	fmt.Println(myS.m2.getString())
    }
    
    func (x myStruct2) getString() string {
    	return "hahahah"
    }
    

    defer关键字:可以保障defer的动作可以在return前被执行
    panic(会执行所有额defer)优于Os.exit()

    goroutine :

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	//goId:=make(chan int)
    	goid := make(chan int)
    	for i := 0; i < 5; i++ {
    		go goroutine(i, goid)
    	}
    	//timer.after()返回一个通道,该通道在一定时间后会接受到一个值
    	timeout := time.After(1 * time.Second)
    
    	for i := 0; i < 5; i++ {
    		select {
    		case num := <-goid:
    			fmt.Println("传过来的数字:", num)
    		case <-timeout:
    			fmt.Println("time out!")
    		}
    	}
    	time.Sleep(1 * time.Second)
    }
    
    func goroutine(i int, id chan int) {
    	time.Sleep(1 * time.Second)
    	fmt.Println(i)
    	id <- i
    }
    
    

    Tcp扫描器(单线程,并发版本)

    package main
    
    import (
    	"fmt"
    	"net"
    	"sync"
    	"time"
    )
    
    // //单线程版本的Tcp扫描器
    // func main() {
    // 	for i := 21; i < 120; i++ {
    // 		address := fmt.Sprintf("49.232.160.123:%d", i)
    // 		//接下来对端口进行扫描
    // 		conn, err := net.Dial("tcp", address)
    
    // 		//判断错误
    // 		if err != nil {
    // 			fmt.Printf("%s 关闭了 
    ", address)
    // 			continue
    // 		}
    // 		//如果没有错,则关闭连接
    // 		conn.Close()
    // 		fmt.Printf("%s 打开了!!
    ", address)
    // 	}
    // }
    
    //并发版本的Tcp扫描器
    func main() {
    	start := time.Now()
    	var wg sync.WaitGroup
    	fmt.Println("GoRoutine")
    	for i := 21; i < 1000; i++ {
    		//+1
    		wg.Add(1)
    		//匿名方法
    		go func(j int) {
    
    			defer wg.Done() //-1操作
    			address := fmt.Sprintf("192.168.0.1:%d", j)
    			//接下来对端口进行扫描
    			conn, err := net.Dial("tcp", address)
    
    			//判断错误
    			if err != nil {
    				//fmt.Printf("%s 关闭了 
    ", address)
    				//出错直接返回
    				return
    			}
    			//如果没有错,则关闭连接
    			conn.Close()
    			fmt.Printf("%s open!!
    ", address)
    		}(i)
    	}
    	wg.Wait()                          //它会阻塞当前main线程--当计数器为0时解除阻塞
    	elapsed := time.Since(start) / 1e9 //纳秒
    	fmt.Printf("
    
     耗时:%d 秒", elapsed)
    }
    
    
  • 相关阅读:
    基因组注释
    GapCloser
    Endnote参考文献格式修改
    多行变单行
    AD的基因组【转载】
    ROC曲线
    自我觉察-4:觉察“不浪费食物”和“胃过饱食”的信念
    自我觉察6-我的价值感?
    表观遗传、开放染色质测序、ATAC-seq、ChIP-seq简介
    ADNI(Alzheimer`s disease neuroimaging initiative)介绍
  • 原文地址:https://www.cnblogs.com/liflower/p/14257276.html
Copyright © 2011-2022 走看看