为什么80%的码农都做不了架构师?>>>   

(TOC)

命令行参数

import "flag"
func main() {ports := flag.String("ports", "10086", "list the port ....")var version_check boolflag.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   stringMysql mysqlInfo
}
type mysqlInfo struct {Host stringPort  intUser stringPasswd    stringDb    string
}
func main() {var config tomlConfigif _, 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 stringvar indexs intif 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.UDPAddrvar server *net.UDPConnvar err errorif 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 []bytefor {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.LoggerError   *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() - 1runtime.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特有的一些格式要求,比如:

  1. 不能有没用的变量,没用到的import
  2. 对外提供的函数,首字母必须大写,否则不能被其他package使用。同一个package不同文件的函数和全局变量直接使用
  3. 尽量少使用异常,通过返回err进行判断和处理,panic在严重时才使用

转载于:https://my.oschina.net/xcxt/blog/1559112

Golang 一些基本功能使用记录相关推荐

  1. Matlab函数功能学习记录(1)

    初学乍练之作 优秀的Matlab讲解: 博客园 Matlab - 基础知识 csdn matlab库函数大全 my Matlab函数功能学习记录(2) Matlab特殊字符.命令和函数 Matlab实 ...

  2. 【100万用户量“排行榜列表”和“我的排名”功能优化记录】

    100万用户量"排行榜列表"和"我的排名"功能优化记录 前言背景: 难点: 解决过程: mongodb小坑: 总结优化过程: 最后: 参考: 前言背景: 最近做 ...

  3. 三菱FX3U与8和称重仪通信的程序。 主要功能是记录8个工位的重量 程序使用ST语言与梯形图的接合运用,使用三菱MODBUS 专用指令,8站轮询

    三菱FX3U与8和称重仪通信的程序. 主要功能是记录8个工位的重量,用威纶通FTP服务器下载到电脑里打印或修改. 程序使用ST语言与梯形图的接合运用,使用三菱MODBUS 专用指令,8站轮询,当有从站 ...

  4. 小新air14 plus 锐龙版R7 5800U睡眠功能折腾记录

    小新air14 plus 锐龙版R7 5800U睡眠功能折腾记录 11月3号拿到电脑后,体验了几天win11,发现了几个问题: vpn软件会报莫名其妙的错误 打开虚拟机,电脑立马蓝屏 睡眠状态放到包里 ...

  5. Golang交叉编译Sqlite3踩坑记录

    Golang交叉编译Sqlite3踩坑记录 ,windows下编译golang go-sqlite3解决方案 众所周知Golang能够在一个平台编译不同平台可执行程序进行发布 然而在遇到需要内置处理程 ...

  6. odoo本地文档功能开发记录

    应公司要求,需要使用odoo系统作为文档管理,知识库管理,并且经个人分析出以下开发要点: ps: 我不是产品经理,但是自己开发没产品经理给具体怎么开发的方案,那一切重点都要想清楚再动手 此篇博客长篇大 ...

  7. 区域环评项目(Vue3 PC)实现验证码等功能 问题记录

    目录 1. HTML.CSS 问题记录 1.1 页面缩放后,滚动条虽然有效,但页面底部会有部分内容被遮挡 1.2 video 标签的 autoplay 属性不起作用,视频无法自动播放 1.3 使用 a ...

  8. 在Moto Atrix4G手机里安装全功能Ubuntu记录(特附友情广告一则)

    上月二手购入传说中的Moto Atrix4G(ME860)手机--就是那个一秒变笔记本电脑的神器手机.为了让这个笔记本电脑更好用一点,自己折腾了一番,记录一下. 折腾之前还有一些刷机.ROOT.精减. ...

  9. DirectDraw 常用功能代码记录

    记录一些常用的代码功能段便于自己以后查找使用: 1.常用宏和函数 #define SafeRelease(lpx) if(lpx!=NULL){lpx->Release();lpx=NULL;} ...

最新文章

  1. python入门用spyder还是jupyter_python3工作环境部署+spyder3+jupyter notebook
  2. int指令01 - 零基础入门学习汇编语言64
  3. 贯穿计算机系统所有方面的重要概念,终于有人讲明白了
  4. ios. GCD 倒计时时间
  5. 程序员的算法课(18)-常用的图算法:广度优先(BFS)
  6. 网络聊天室的技术与发展
  7. 台式计算机关机后自行重启,台式机电脑总是自动关机重启该怎么解决?
  8. 如何获取不重复的随机数
  9. 想自学python看哪位的视频比较好-python学习视频好的有哪些
  10. MongoDBTool-最新进展报告
  11. cmd中,执行java命令与javac命令的区别
  12. 程序员记录每天工作日志软件_程序员日志记录简介
  13. nyoj 月老的难题【最大匹配】
  14. 启动类上的@MapperScan注解与yml配置中mybatis.mapper-locations和mybatis.type-aliases-package的作用
  15. listdir() 方法的使用
  16. Redis安装整理(window平台和Linux平台)
  17. 7月Python最佳开源项目Top 10
  18. [R]第一节 初始R语言
  19. composer 学习
  20. 帝国cms 未审核 showinfo.php,帝国CMS自动审核发布信息脚本

热门文章

  1. HashMap 的设置值,取值,遍历等
  2. Go语言线程与协程之间的关系之GMP模型
  3. 安卓屏幕适配方案(根据今日头条方案,升级版)
  4. (一) 自带刷新的列表-LtRecyclerView v2.x版本(LtAdapter)(基本使用)
  5. 银行java多线程例子_Java 多线程 之 银行ATM实例
  6. oracle refresh force,千万级表上的物化视图(force模式 ),手动刷新,为何速度奇慢?...
  7. mysql not in优化_MySQL性能优化 — 实践篇2
  8. 【C++】42.使用YAML文件进行参数配置、读取与生成YAML文件
  9. 基于R-CNN的物体检测-CVPR 2014
  10. Java多线程间的通信