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 关闭了 \n", address)
// continue
// }
// //如果没有错,则关闭连接
// conn.Close()
// fmt.Printf("%s 打开了!!\n", 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 关闭了 \n", address)
//出错直接返回
return
}
//如果没有错,则关闭连接
conn.Close()
fmt.Printf("%s open!!\n", address)
}(i)
}
wg.Wait() //它会阻塞当前main线程--当计数器为0时解除阻塞
elapsed := time.Since(start) / 1e9 //纳秒
fmt.Printf("\n\n 耗时:%d 秒", elapsed)
}