二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Shell编程

  • Go编程笔记

    • 开发技巧

      • go日常开发代码片段
        • 获取终端输入
        • 生成一个随机数
        • 获取主机 IP
        • 如何获取一周前,一天前的时间
        • 如何判断一个字符串是否在切片列表里
      • golang交叉编译
      • 两个切片内容相减的几种方法
      • golang以结构体中某个字段进行排序
      • vscode开发golang报黄提示composite literal uses unkeyed fields
      • golang使用$in或$nin查询MongoDB是否在数组内的数据
      • golang使用$push和$addToSet往数组添加字段的异同
      • MongoDB自增ID在golang中的实践
      • golang数据类型转换汇总
      • 记录VSCode中写Go代码切换Sqlite无CGO依赖版本的过程以及遇到的五个问题
      • 企业微信自建应用-golang校验回调
      • 对接腾讯云未集成到SDK的接口开发实践小记
      • Go开发实践之Gin框架将前端的dist目录embed到二进制
    • 库包研究

    • 个人项目

  • 前端编程笔记

  • Go学习笔记

  • Vue-21年学习笔记

  • Vue-22年重学笔记

  • 编程世界
  • Go编程笔记
  • 开发技巧
二丫讲梵
2021-07-13
目录

go日常开发代码片段

文章发布较早,内容可能过时,阅读注意甄别。

# 获取终端输入

一般情况下,我们使用 fmt 包的 scan 方法来获取终端输入内容,但是这可能会有一个问题,如果输入内容有空格或者换行,就不适用了,因此,可以通过 bufio 来实现获取输入的功能。

package main

import (
	"bufio"
	"fmt"
	"os"
)

func input1() {
	var s string
	fmt.Print("请输入内容:")
	fmt.Scanln(&s)
	fmt.Printf("输入的内容为:%s\n", s)
}

func input2() {
	var s string
	reader := bufio.NewReader(os.Stdin)
	s, _ = reader.ReadString('\n') //指定获取输入时的分隔标识
	fmt.Printf("输入的内容为:%s\n", s)

}

func main() {
	//问题在于,当用户输入内容为  a b c时,程序获取到的只有a,亦即空格即被截断
	// input1()
	input2()
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 生成一个随机数

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 设置一个时间种子
	rand.Seed(time.Now().UnixNano())
	// 表示随机返回一个0到100之间的数字
	s := rand.Intn(100)
	fmt.Println(s)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 获取主机 IP

package main

import (
	"fmt"
	"net"
	"strings"
)

func GetOutboundIP() (ip string, err error) {
	conn, err := net.Dial("udp", "8.8.8.8:80")
	if err != nil {
		return
	}
	defer conn.Close()
	localAddr := conn.LocalAddr().(*net.UDPAddr)
	//fmt.Println(localAddr.String())
	ip = strings.Split(localAddr.IP.String(), ":")[0]
	return
}

func main() {
	ip, err := GetOutboundIP()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(ip)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

执行效果如下:

[root@ops-eryajf-test-1 test]$go run main.go
10.3.0.41
1
2

# 如何获取一周前,一天前的时间

获取一天前或者一周前应该是日常当中经常遇到的场景,这里说一下 go 当中的实现方式:

package main
import (
  "fmt"
  "time"
)
func main() {
//Add方法和Sub方法是相反的,获取t0和t1的时间距离d是使用Sub
//将t0加d获取t1就是使用Add方法
  k := time.Now()
  //一天之前
  d, _ := time.ParseDuration("-24h")
  fmt.Println(k.Add(d))
  //一周之前
  fmt.Println(k.Add(d * 7))
  //一月之前
  fmt.Println(k.Add(d * 30))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

上边例子比较有意义的是一周之前,一天之前或者一月之前的算法,更多用如下方式:

t := time.Now()
// 计算前一天, 当前时间加上0年,0月,-1天
t1 := t.AddDate(0,0,-1)

// 计算上一个月时间,当前时间加上0年,-1月,0天
t1 := t.AddDate(0,-1,0)
1
2
3
4
5
6

# 如何判断一个字符串是否在切片列表里

有时候我们会通过遍历拿到数据,但是这些数据当中的部分内容是我们特别关心的,这个时候就出现了一个场景:遍历的时候如何判断字符串是否在自己关心的列表当中?

func Find(slice []string, val string) (int, bool) {
    for i, item := range slice {
        if item == val {
            return i, true
        }
    }
    return -1, false
}

func main() {
  dataList := []string{"test1", "test2"}
  
  dataStr := "test1"  
  // 传入切片 和 要查找的字符串
  _, flag := Find(dataList, dataStr)
  if flag {
    fmt.Println("存在 -> ", dataStr)
  } else {
    fmt.Println("不存在 -> ", dataStr)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

这个时候我们就可以借助于上边的这个小工具来快速过滤或者判断对应的字符串是否是自己想要的了。

微信 支付宝
#go
上次更新: 2024/06/13, 22:13:45
利用shell脚本将博客数据库备份到邮箱附件
golang交叉编译

← 利用shell脚本将博客数据库备份到邮箱附件 golang交叉编译→

最近更新
01
学习周刊-总第213期-2025年第22周
05-29
02
学习周刊-总第212期-2025年第21周
05-22
03
从赵心童世锦赛夺冠聊聊我的斯诺克情缘
05-16
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式