Go 代码记录(一)

1、hello world!

// 同一个目录下面不能有个多 package main
package main

// 导包
import "fmt"

// 程序入口
func main() {
    fmt.Println("Hello world")
}

2、HTTP文件服务器

// 标记当前文件为 main 包,main 包也是 Go 程序的入口包
package main

// 导入 net/http 包,这个包的作用是 HTTP 的基础封装和访问
import (
    "net/http"
)

/**
HTTP文件服务器
*/
// 程序执行的入口函数 main()
func main() {

    // 使用 http.FileServer 文件服务器将当前目录作为根目录(/目录)的处理器,访问根目录,就会进入当前目录
    http.Handle("/", http.FileServer(http.Dir(".")))
    // 默认的 HTTP 服务侦听在本机 8080 端口
    http.ListenAndServe(":8080", nil)
}

// 在浏览器里输入http://127.0.0.1:8080即可浏览文件,这些文件正是当前目录在HTTP服务器上的映射目录。

3、并发编程

// 同一个目录下面不能有个多 package main
package main

// 导入格式化(fmt)、随机数(math/rand)、时间(time)包参与编译
import (
    "fmt"
    "math/rand"
    "time"
)

// 生产数据的函数,传入一个标记类型的字符串及一个只能写入的通道
// 数据生产者
func producer(header string, channel chan<- string) {
    // for{} 构成一个无限循环
    // 无限循环,不停地生产数据
    for {
        // 使用 rand.Int31() 生成一个随机数,使用 fmt.Sprintf() 函数将 header 和随机数格式化为字符串
        // 将随机数和字符串格式化为字符串发送给通道
        channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
        // 使用 time.Sleep() 函数暂停 1 秒再执行这个函数。如果在 goroutine 中执行时,暂停不会影响其他 goroutine 的执行
        // 等待1秒
        time.Sleep(time.Second)
    }
}

// 消费数据的函数,传入一个只能写入的通道
// 数据消费者
func customer(channel <-chan string) {
    // 不停的获取数据
    for {
        // 从通道中获取数据,此处会阻塞直到信道中返回数据
        message := <-channel
        // 打印数据
        fmt.Println(message)
    }
}

// 程序的入口函数,总是在程序开始时执行
func main() {

    // 创建一个字符串类型的通道
    channel := make(chan string)
    // 并发执行一个生产者函数,两行分别创建了这个函数搭配不同参数的两个 goroutine
    // 创建producer()函数的并发goroutine
    go producer("cat", channel)
    go producer("dog", channel)
    // 执行消费者函数通过通道进行数据消费
    // 数据消费函数
    customer(channel)
}

/**
整段代码中,没有线程创建,没有线程池也没有加锁,仅仅通过关键字 go 实现 goroutine,和通道实现数据交换。

编译成exe文件:go build go-test/test3/concurrent.go
*/

4、计算器

add.go

package simplemath

// 加法
func Add(a int, b int) int{
    return a + b
}

sqrt.go

package simplemath

import "math"

// 平方根
func Sqrt(i int) int{
    v := math.Sqrt(float64(i))
    return int(v)
}

main.go

package main

// 引入其他包
import (
    "fmt"
    "go-test/simplemath"
    "os"
    "strconv"
)
// 定义一个用于打印程序使用指南的函数
var Usage = func(){
    fmt.Println("USAGE:calc command [arguments] ...")
    fmt.Println("\nThe commands are:\n\tadd\t计算两个数值相加\n\tsqrt\t计算一个非负数的平方根")
}

// 程序入口函数
func main(){
    /*
     * 用于获取命令行参数,注意程序名本身是第一个参数,
     * 比如 calc add 1 2 这条指令,第一个参数是 calc
     */
    // := 声明并初始化变量,不需要通过 var 声明该变量
    args := os.Args
    // 除程序名本身外,至少需要传入两个其他参数,否则退出
    if args == nil || len(args) < 3{
        Usage()
        return
    }
    // 第二个参数表示计算方法
    switch args[1]{
        // 加法
        case "add":
            // 至少需要4个参数
            if len(args) != 4{
                fmt.Println("USAGE: calc add <integer1><integer2>")
                return
            }
            // 获取待相加的类型,并将类型转换为整型
            v1, err1 := strconv.Atoi(args[2])
            v2, err2 := strconv.Atoi(args[3])
            // 获取参数出错,则退出
            if err1 != nil || err2 != nil{
                fmt.Println("USAGE: calc add <integer1><integer2>")
                return
            }
            // 从 simplemath 包引入 Add 方法
            ret := simplemath.Add(v1, v2)
            fmt.Println("Result: ", ret)
        // 求方根
        case "sqrt":
            if len(args) != 3{
                fmt.Println("USAGE: calc sqrt <integer>")
                return
            }
            v, err := strconv.Atoi(args[2])
            if err != nil{
                fmt.Println("USAGE: calc sqrt <integer>")
                return
            }
            ret := simplemath.Sqrt(v)
            fmt.Println("Result: ", ret)

        default:
            Usage()
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容