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)
}

原文地址:https://www.cnblogs.com/liflower/p/14257276.html