日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang 一些基本功能使用记录

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang 一些基本功能使用记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么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特有的一些格式要求,比如:

  • 不能有沒用的變量,沒用到的import
  • 對外提供的函數,首字母必須大寫,否則不能被其他package使用。同一個package不同文件的函數和全局變量直接使用
  • 盡量少使用異常,通過返回err進行判斷和處理,panic在嚴重時才使用
  • 轉載于:https://my.oschina.net/xcxt/blog/1559112

    總結

    以上是生活随笔為你收集整理的Golang 一些基本功能使用记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。