Golang Basic - select and channel usage

本文深入探讨了Golang中的Tag使用方法及其在JSON序列化中的作用,并通过示例展示了Select和Channel的基本操作及应用场景。

今天学习了一下Golang 的 tag,select 和 channel ,记录在此!

1.tag 的作用

package main

import (
	"encoding/json"
	"fmt"
	"reflect"
)

type Accout struct {
	UserId   int    `json:"user_id" bson:"user_id"`
	UserName string `json:"user_name" bson:"user_name"`
	Password string `json:"pass_word" bson:"pass_word"`
}

func main() {
	account := &Accout{UserId: 1, UserName: "justin", Password: "12345"}
	accountJson, _ := json.Marshal(account)
	fmt.Println(string(accountJson))

	t := reflect.TypeOf(account)

	for i := 0; i < 3; i++ {
		field := t.Elem().Field(i)
		fmt.Println(field.Tag.Get("json"))
		fmt.Println(field.Tag.Get("bson"))
	}
}
输出:

{"user_id":1,"user_name":"justin","pass_word":"12345"}
user_id
user_id
user_name
user_name
pass_word
pass_word
2.select 和 channel

package main

import (
	"fmt"
	"strconv"
	"time"
)

func test1() {
	ch1 := make(chan int, 1)
	ch2 := make(chan int, 1)

	ch1 <- 1
	ch2 <- 1

	select {
	case <-ch1:
		fmt.Println("ch1 pop one element")
	case <-ch2:
		fmt.Println("ch2 pop one element")
	}
}

func test2() {
	timeout := make(chan bool, 1)
	ch := make(chan int, 1)
	ch <- 1
	go func() {
		time.Sleep(3000)
		timeout <- true
	}()

	select {
	case <-ch:
		fmt.Println("got value")
	case <-timeout:
		fmt.Println("timeout")
	}
}

func test3() {
	taskChan := make(chan string, 3)
	doneChan := make(chan bool, 1)

	for i := 0; i < 3; i++ {
		taskChan <- strconv.Itoa(i)
		fmt.Println("send: ", i)
	}

	go func() {
		for i := 0; i < 3; i++ {
			task := <-taskChan
			fmt.Println("received: ", task)
		}
		doneChan <- true
	}()

	<-doneChan
}

func main() {
	test2()
}
这里的go function是在新的线程里面执行,而返回的结果可以到主线程中。



<think>首先,用户的问题是基于给定的镜像信息生成docker save命令。镜像信息包括: - alpine 3.12 - golang 1.16-alpine3.14 - golang 1.15-alpine - golang 1.16-alpine3.12 我需要生成类似docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12的命令。 用户的例子是:docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12 所以,我应该为每个镜像生成一个类似的命令。 命令格式是: docker save -o [输出文件路径] [镜像名]:[标签] 用户指定了一个特定的输出路径:/mnt/hgfs/share/golang1-16-alpine3-12.tar 我需要为每个镜像创建类似的输出文件名。文件名应该基于镜像名和标签。 列出镜像信息: 1. alpine 3.12 → 镜像名:alpine,标签:3.12 2. golang 1.16-alpine3.14 → 镜像名:golang,标签:1.16-alpine3.14 3. golang 1.15-alpine → 镜像名:golang,标签:1.15-alpine 4. golang 1.16-alpine3.12 → 镜像名:golang,标签:1.16-alpine3.12 现在,输出文件路径:用户使用了/mnt/hgfs/share/目录,文件名是golang1-16-alpine3-12.tar 我应该为每个镜像生成一个文件名: - 对于alpine:3.12,文件名可能是alpine-3.12.tar - 对于golang:1.16-alpine3.14,文件名可能是golang1-16-alpine3-14.tar - 对于golang:1.15-alpine,文件名可能是golang1-15-alpine.tar(假设没有具体版本,就用这个) - 对于golang:1.16-alpine3.12,文件名可能是golang1-16-alpine3-12.tar(用户例子中已有) 在用户例子中,输出路径是/mnt/hgfs/share/,所以我应该使用相同的目录路径。用户说“类似docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar”,所以我可以假设输出目录是/mnt/hgfs/share/,除非用户指定。 用户指令是“生成类似docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12的docker save命令”,所以我应该复制相同的输出路径格式。 现在,生成命令: 1. 对于alpine:3.12: - 镜像名:alpine:3.12 - 输出文件:/mnt/hgfs/share/alpine-3.12.tar 命令:docker save -o /mnt/hgfs/share/alpine-3.12.tar alpine:3.12 2. 对于golang:1.16-alpine3.14: - 镜像名:golang:1.16-alpine3.14 - 输出文件:/mnt/hgfs/share/golang1-16-alpine3-14.tar 命令:docker save -o /mnt/hgfs/share/golang1-16-alpine3-14.tar golang:1.16-alpine3.14 3. 对于golang:1.15-alpine: - 这里有歧义。标签是“1.15-alpine”,但完整的镜像名应该是golang:1.15-alpine。 - 输出文件:/mnt/hgfs/share/golang1-15-alpine.tar 命令:docker save -o /mnt/hgfs/share/golang1-15-alpine.tar golang:1.15-alpine 4. 对于golang:1.16-alpine3.12: - 用户已经提供了一个例子:docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12 所以,我可以直接使用那个。 用户说“根据给定的镜像信息”,并列出它们,所以包括所有四个。 用户提到“golang 1.16-alpine3.12”已经在例子中,但既然用户要求“生成”,我应该为所有列出。 用户原文:“根据镜像信息alpine 3.12、golang 1.16-alpine3.14、golang 1.15-alpine、golang 1.16-alpine3.12” 所以四个都需要。 确保文件名一致:在用户例子中,文件名是golang1-16-alpine3-12.tar,使用了破折号和点号,但文件名中通常用破折号代替冒号或点号以避免问题。 在例子中:golang1-16-alpine3-12.tar,所以格式是镜像名去掉冒号,标签用破折号连接。 对于alpine:3.12 → alpine-3.12.tar golang:1.16-alpine3.14 → golang1-16-alpine3-14.tar(注意标签本身有破折号) 在镜像标签中,golang:1.16-alpine3.14,标签是1.16-alpine3.14,所以在导出时,文件名可以基于镜像名和完整标签。 在用户例子中,对于golang:1.16-alpine3.12,文件名是golang1-16-alpine3-12.tar,意思是组合镜像名和标签成为一个文件名部分。 所以类似: - alpine:3.12 → alpine-3.12.tar - golang:1.16-alpine3.14 → golang1-16-alpine3-14.tar(注意,镜像名是golang,标签是1.16-alpine3.14) 在文件名中,应该是镜像名后跟标签,用破折号连接。 但在标签中,已经有破折号,如1.16-alpine3.14。 用户例子中是golang1-16-alpine3-12.tar,意思是省略了冒号,直接连接。 所以,为了一致: - alpine:3.12 → alpine-3.12.tar - golang:1.16-alpine3.14 → golang1-16-alpine3-14.tar - golang:1.15-alpine → golang1-15-alpine.tar - golang:1.16-alpine3.12 → golang1-16-alpine3-12.tar(已有) 现在,输出路径是/mnt/hgfs/share/,这是用户指定的,我应该使用它。 在命令中,输出文件路径包括文件名。 现在,回答结构:用户要求“生成docker save命令”,所以我可以列出每个命令。 系统指令说:回答结构清晰,帮助用户逐步解决问题。 所以,我可以先解释一下,然后列出命令。 另外,系统指令有“生成相关问题”,在最后。 用户上次问题:在对话历史中,没有明显的上一次问题,这是这个对话的开始。用户说“参考站内引用”,但上下文是空的,所以可能忽略。 用户消息:"参考站内引用:。上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。" 但在对话历史中,只有系统级指令和用户的这个新问题。 在示例中,有"用户上一次的问题",但这里是第一次互动。 所以,或许直接回答。 现在,生成命令。 总结命令: 1. 对于alpine:3.12: docker save -o /mnt/hgfs/share/alpine-3.12.tar alpine:3.12 2. 对于golang:1.16-alpine3.14: docker save -o /mnt/hgfs/share/golang1-16-alpine3-14.tar golang:1.16-alpine3.14 3. 对于golang:1.15-alpine: docker save -o /mnt/hgfs/share/golang1-15-alpine.tar golang:1.15-alpine 4. 对于golang:1.16-alpine3.12: docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12 用户已经提供了golang:1.16-alpine3.12的例子,所以我可以提到它。 在回答中,我应该确保格式正确。 最后,生成相关问题,作为系统指令的一部分。 系统指令:"6.生成相关问题" 在示例中,有"§§相关问题§§"部分。 所以,我需要添加相关问题。 相关问题应该基于当前主题:Docker镜像导出。 例如: - 如何导入这些导出的镜像? - docker save命令的其他选项? - 为什么要导出镜像? 等等。 现在,用中文回答所有内容。 回答结构: 1. 简要解释命令。 2. 列出每个命令。 3. 相关问题。 开始写。 </think>### 根据镜像信息生成 Docker Save 命令 您提供了四个镜像信息:`alpine 3.12`、`golang 1.16-alpine3.14`、`golang 1.15-alpine` 和 `golang 1.16-alpine3.12`。我将基于这些信息生成 `docker save` 命令,命令格式与您给出的示例(`docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12`)一致。具体来说: - 输出文件路径:使用统一的目录 `/mnt/hgfs/share/`(与您示例中的路径相同)。 - 输出文件名:基于镜像名和标签生成,格式为 `[镜像名]-[标签].tar`(标签中的特殊字符如冒号或点号用破折号替代,确保文件名兼容性)。 - 命令格式:`docker save -o [输出文件路径] [镜像名]:[标签]`。 以下是生成的命令列表(每个命令对应一个镜像): 1. **对于镜像 `alpine:3.12`**: 输出文件名:`alpine-3.12.tar`(镜像名为 `alpine`,标签为 `3.12`)。 命令: ```bash docker save -o /mnt/hgfs/share/alpine-3.12.tar alpine:3.12 ``` 2. **对于镜像 `golang:1.16-alpine3.14`**: 输出文件名:`golang1-16-alpine3-14.tar`(镜像名为 `golang`,标签为 `1.16-alpine3.14`)。 命令: ```bash docker save -o /mnt/hgfs/share/golang1-16-alpine3-14.tar golang:1.16-alpine3.14 ``` 3. **对于镜像 `golang:1.15-alpine`**: 输出文件名:`golang1-15-alpine.tar`(镜像名为 `golang`,标签为 `1.15-alpine`)。 命令: ```bash docker save -o /mnt/hgfs/share/golang1-15-alpine.tar golang:1.15-alpine ``` 4. **对于镜像 `golang:1.16-alpine3.12`**: 输出文件名:`golang1-16-alpine3-12.tar`(与您提供的示例一致)。 命令: ```bash docker save -o /mnt/hgfs/share/golang1-16-alpine3-12.tar golang:1.16-alpine3.12 ``` ### 使用说明 - 运行这些命令前,请确保: - Docker 服务已在系统中运行(可通过 `docker --version` 检查)。 - 镜像已存在于本地(可使用 `docker images` 验证),否则 `docker save` 会报错[^1]。 - 输出目录 `/mnt/hgfs/share/` 存在且有写权限(可通过 `ls /mnt/hgfs/share/` 检查)。 - 导出完成后,文件为 `.tar` 格式,可通过 `docker load -i [文件路径]` 导入到其他 Docker 环境。 如果您需要修改输出路径或文件名,请提供更多细节,我可以调整命令。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值