Golang 一些基本功能使用记录
2017-11-01 00:00
302 查看
摘要: 初学,记录golang一些基本功能的使用方法:获取命令行参数、配置文件、socket收发数据、连接MySQL、日志、原子统计。可能还会补充
(TOC)
配置文件如下,需要名称和tomlconfig中的相同,并且代码中首字母大写,配置中小写
在实验环境中,如果对端没有处理指定端口的数据,会每隔一秒种返回一个ICMP包提示
此时发送程序会有对应的发送失败提示,也是每秒钟一个
不能有没用的变量,没用到的import
对外提供的函数,首字母必须大写,否则不能被其他package使用。同一个package不同文件的函数和全局变量直接使用
尽量少使用异常,通过返回err进行判断和处理,panic在严重时才使用
(TOC)
命令行参数
import "flag" func main() { ports := flag.String("ports", "10086", "list the port ....") var version_check bool flag.BoolVar(&version_check, "v", false, "version") flag.Parse() if version_check { do() } portsList := strings.Split(*ports, ",") if len(portsList) > 5 { fmt.Println("no more than 5 ports") return } }
配置文件
package main import ( "fmt" "github.com/BurntSushi/toml" ) type tomlConfig struct { Title string Mysql mysqlInfo } type mysqlInfo struct { Host string Port int User string Passwd string Db string } func main() { var config tomlConfig if _, err := toml.DecodeFile("config.toml", &config); err != nil { fmt.Println(err) return } fmt.Println(config.Title) fmt.Println(config.Mysql.Host) }
配置文件如下,需要名称和tomlconfig中的相同,并且代码中首字母大写,配置中小写
Title = "test" [mysql] host = "11.22.33.44" port = 3306 user = "smart" passwd = "smart" db = "smart"
MySQL
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func fetchdata() { db, err := sql.Open("mysql", "user:passwd@tcp(host:port)/database") if err != nil { fmt.Println(err) } err = db.Ping() if err != nil { fmt.Println(err) } rows, err := db.Query("select * from table") if err != nil { fmt.Println(err) } for rows.Next() { var counts string var indexs int if err := rows.Scan(&counts, &indexs); err != nil { fmt.Println(err) } fmt.Println(counts, indexs) } defer db.Close() } func main() { fetchdata() }
Socket
func udpReceiver(port string) { defer workExitLock.Done() var addr *net.UDPAddr var server *net.UDPConn var err error if addr, err = net.ResolveUDPAddr("udp", port); err != nil { Error.Printf("Udp listener error: %s", err) return } if server, err = net.ListenUDP("udp", addr); err != nil { Error.Printf("Udp listener error: %s", err) return } if err = server.SetReadBuffer(UDP_READ_BUFF); err != nil { Error.Printf("Udp listener error: %s", err) return } Info.Printf("Listen Udp Sucessfully, port: %s", port) var buf []byte for { if len(buf) < UDP_PACK_SIZE { buf = make([]byte, PACK_BUF_SIZE, PACK_BUF_SIZE) } nbytes, addr, err := server.ReadFromUDP(buf) if err != nil { Error.Printf("Receive udp data error: %s", err) continue } msg := buf[:nbytes] buf = buf[nbytes:] udpChan <- UdpMessage{addr, msg} } } // 可选udp或者tcp func netSender(typename string, addr string, retry int) { for { conn, err := net.Dial(typename, addr) if err != nil { Error.Printf("make conn error: ", err) time.Sleep(time.Duration(retry) * time.Second) continue } for one := range resChan { _, err = conn.Write([]byte(one)) if err != nil { Error.Printf("send data error: %s", err) conn.Close() break } } } }
在实验环境中,如果对端没有处理指定端口的数据,会每隔一秒种返回一个ICMP包提示
udp port distinct unreachable
此时发送程序会有对应的发送失败提示,也是每秒钟一个
log
package main import ( "config" "io" "log" "os" ) var ( Info *log.Logger Error *log.Logger ) func Init( infoHandle io.Writer, errorHandle io.Writer) { Info = log.New(infoHandle, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) Error = log.New(errorHandle, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) } func logInit(conf config.ProcessInfo) { pinfo := conf.Logdir + "/" + "log.info" perro := conf.Logdir + "/" + "log.err" finfo, err := os.OpenFile(pinfo, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("file open error : %v", err) } ferro, err := os.OpenFile(perro, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("file open error : %v", err) } Init(finfo, ferro) } func main() { gomaxprocs := runtime.NumCPU() - 1 runtime.GOMAXPROCS(gomaxprocs) Info.Printf("Program start. GOMAXPROCS: %d", gomaxprocs) }
同步统计
使用sync/atomic,利用其实现的函数可以达到无冲突的统计
import "sync/atomic" type count64 uint64 func (c *count64) increment(incr int) count64 { return count64(atomic.AddUint64((*uint64)(c), uint64(incr))) } func (c *count64) get() count64 { return count64(atomic.LoadUint64((*uint64)(c))) }
其他
要注意golang特有的一些格式要求,比如:不能有没用的变量,没用到的import
对外提供的函数,首字母必须大写,否则不能被其他package使用。同一个package不同文件的函数和全局变量直接使用
尽量少使用异常,通过返回err进行判断和处理,panic在严重时才使用
相关文章推荐
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- linux的一些基本命令(用来记录自己使用过的一些命令)
- SharePoint 2013 使用JQuery 一些记录如(SharePoint js 获得当前用户)等基本操作。
- Linux 一些基本指令简单使用记录
- Docker学习系列(三):Ubuntu下使用Docker的基本指令记录及一些注意事项
- 这两天使用JSP开发程序,记录一些基本方法
- 整理Java的MyBatis框架中一些重要的功能及基本使用示例
- HTML中使用python屏蔽一些基本功能的方法
- html中如何使用python屏蔽一些基本功能
- 使用XML记录数据的一些体会
- 初学eclipse,记录一些有关eclipse IDE使用的东东
- Lucene的一些基本使用方法和概念 (JAVA)
- GridView的基本功能和使用方法
- GridView的基本功能以及使用方法
- C#中对XML文件的一些基本操作(使用DOM Tree)
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- Oracle SQLPlus 一些使用经验记录(设置环境变量和字符串比较)
- lucene.net的一些基本使用方法和概念
- 在vs中使用ZedGraph控件的一些记录