热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang快速入门(一)初尝Go

提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者一、见初国内官网https:golang.google.cn1.linux二进制安装#获取go1.16.4wgethttp

提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者

一、见初

国内官网https://golang.google.cn/

1.linux二进制安装
#获取go1.16.4
wget https://golang.google.cn/dl/go1.16.4.linux-amd64.tar.gz  

tar -xf go1.16.4.linux-amd64.tar.gz  -C /usr/local

echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile

source /etc/profile

#验证安装
[root@VM-0-5-centos bin]# go version
go version go1.16.4 linux/amd64



2.Hello, Water Man!

vim water_man.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, Water Man!")
}

go run water_man.go

Hello, Water Man!

go应用可直接编译目标平台二进制可执行文件

[root@VM-0-5-centos hellogo]# go build water_man.go 
[root@VM-0-5-centos hellogo]# ls
water_man  water_man.go
[root@VM-0-5-centos hellogo]# ./water_man 
Hello, Water Man!

二、了解go

1. go module

golang的包管理工具。

包设计的初衷是方便模块化设计和使用,在go中模块是包的集合,如果模块需要被其他人使用,则应该在go mod init初始化时以可以下载的web地址命名,产生的go.mod在go运行或编译时可跟踪依赖。

初始化rush_b模块

mkdir rush_b && cd rush_b

[root@VM-0-5-centos rush_b]# go mod init github.com/csgo/rush_b
go: creating new go.mod: module github.com/csgo/rush_b

#获得包含包列表名和go版本号的go.mod文件
[root@VM-0-5-centos rush_b]# ls
go.mod

创建rush_b.go 编写模块实现函数,用于共享的功能模块函数首字母应大写

package rush_b

import "fmt"

func Rush(name string) string{
  message := fmt.Sprintf("%v, Follow me!",name)
  return message
}

  • go中函数定义中需要把声明的类型放在后面。

    golang快速入门(一)初尝Go

  • := 相当于同时定义和赋值,是下面的简写

    var message string
    message = fmt.Sprinf("%v,Follow me!",name)
    

创建好go.modrush_b.go后我们的github.com/csgo/rush_b模块就创建好了,接下来该考虑怎么引用它。

同理我们创建一个water_man文件夹

[root@VM-0-5-centos hellogo]# ll water_man/
total 8
-rw-r--r-- 1 root root  32 May 11 20:49 go.mod
-rw-r--r-- 1 root root 169 May 11 20:54 water_man.go

导入rush_b模块,使用其中的rush函数。

package main

import (
    "fmt"
    "github.com/csgo/rush_b"
)
func main() {
    fmt.Println("Hello")
    message :=rush_b.Rush("water man")
    fmt.Println(message)
}    

go run之后会根据地址去下载模块,由于模块是本地模块,所以我们go mod edit --replace=github.com/csgo/rush_b=../rush_b 告诉go 使用本地模块。

golang快速入门(一)初尝Go

再此go run,正常调用了rush_b模块的Rush函数。

golang快速入门(一)初尝Go

2.errors与log 用于规范错误提示和日志排查。

当调用的Rush函数入参为空时返回错误。

//rush_b.go
package rush_b

import (
        "fmt"
        "errors"
)

func Rush(name string) (string,error){
  if name == ""{
    return "",errors.New("empty name")
  }
  message := fmt.Sprintf("%v, Fllow me!",name)
  return message,nil
}


//water_man.go
package main

import (
    "fmt"
    "log"
    "github.com/csgo/rush_b"
)
func main() {
    //fmt.Println("Hello")
    log.SetPrefix("logging:")   //设置前缀
    log.SetFlags(0)
    message,err := rush_b.Rush("")
    fmt.Println(message)
    if err !=nil{
      //fmt.Println("it is an err")
      log.Fatal(err)   //打印error
    }
}  

[root@VM-0-5-centos water_man]# go run water_man.go 
logging:empty name
exit status 1

3.让S1mple跟我rush B

rush_b.go 当调用Rush时会随机返回addr切片中的一个标语。

package rush_b

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

func Rand_init(){  //随机数种子
   rand.Seed(time.Now().UnixNano()) 
}
func RandomFormat() string {
    addr :=[]string{
      "%v ,follow me rush A",
      "%v ,follow me rush B",
      "%v ,follow me rush dust2",
    }
    return addr[rand.Intn(len(addr))]   //len函数、Intn方法返回一个[0,n)的整数
}
func Rush(name string) (string,error){
  if name == ""{
    return "",errors.New("empty name")
  }
  message := fmt.Sprintf(RandomFormat(),name)
  return message,nil
}

water_man.go

package main

import (
    "fmt"
    "log"
    "github.com/csgo/rush_b"
)
func main() {
    //fmt.Println("Hello")
    rush_b.Rand_init()    //初始化种子
    log.SetPrefix("logging:")
    log.SetFlags(0)
    message,err := rush_b.Rush("s1mple")  //传入S1mple
    fmt.Println(message)
    if err !=nil{
      //fmt.Println("it is an err") 
      log.Fatal(err)
    }
}

go run water_man.go rush到哪不一定!

[root@VM-0-5-centos water_man]# go run water_man.go 
s1mple ,follow me rush dust2
[root@VM-0-5-centos water_man]# go run water_man.go 
s1mple ,follow me rush B
[root@VM-0-5-centos water_man]# go run water_man.go 
s1mple ,follow me rush dust2
[root@VM-0-5-centos water_man]# 
4. 让top3给我打佯攻

使用到了map,类似于python中的字典

// rush_b.go
package rush_b

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

func Rand_init(){
   rand.Seed(time.Now().UnixNano()) 
}
func RandomFormat( name string) (string,error) {
  if name == ""{
    return "",errors.New("empty name")
  }
  addr := []string {

    "%v ,follow me rush A",
    "%v ,follow me rush B",
    "%v ,follow me rush dust2",
  }
  return fmt.Sprintf(addr[rand.Intn(len(addr))],name),nil
}


func Yg(names []string ) (map[string]string,error){   //佯攻
  messages := make(map[string]string)    // map初始化
  
  for _,name := range names{
    message,err := RandomFormat(name)
    if err != nil {
      return nil, err
    }
    messages[name] = message
  } 
  return messages,nil
}


//water_man.go
package main

import (
    "fmt"
    "log"
    "github.com/csgo/rush_b"
)
func main() {
    //fmt.Println("Hello")
    rush_b.Rand_init()
    log.SetPrefix("logging:")
    log.SetFlags(0)
    hero:=[]string{"s2mple","zywoo1","device"}
    message,err := rush_b.Yg(hero)
    for i := 0; i 

go run water_man.go 执行情况如下:

[root@VM-0-5-centos water_man]# go run water_man.go 
s2mple ,follow me rush B
zywoo1 ,follow me rush A
device ,follow me rush A

文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注***饮水机管理员,除了管烧热水,有时还做点别的。


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
彩红症-患者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有