当前位置: 首页 > news >正文

Golang语法快速上手3

目录

      • golang入门进阶组1
        • 调用命令行
        • 函数进阶
        • 闭包
        • 方法
        • 接口

golang入门进阶组1

调用命令行

所有的命令行参数都会被解析为字符串类型的

os.Args 接收所有我们传入的参数;

假设该文件编译为了一个 exe,我们执行该 exe 是使用代码: main.exe asd 123
则上面三个元素都会变成参数传递给 os.Args

import (
	"fmt"
	"os"
)

func main() {
	// 获取传入参数个数
	num := len(os.Args)
	// 输出所有参数
	for i := 0; i < num; i++ {
		fmt.Printf(os.Args[i])
	}
}

flag 包可以自定义传参名称

则运行 exe 是可以使用命令:main.exe -name=tom

// 写法一
func main() {
	// flag对应的三个参数
	// 参数名、参数默认值、参数简介
	name := flag.String("name", "jack", "使用者名称")
	// 命令行参数解析到注册函数
	flag.Parse()
	// flag返回的均为指针类型,所以需要解指针
	fmt.Println("名字是:", *name)
}

// 写法二
func main() {
	var (
		name string
		age  int
	)
	flag.StringVar(&name, "name", "jack", "姓名")
	flag.IntVar(&age, "age", 13, "你的年龄")
	flag.Parse()
}

函数进阶

go 中甚至可以为返回值指定名称,即系统会自动返回该名称变量

// 注意这里不使用:=
func say() (res string) {
	res = "shit"
	return
}

匿名函数

func main() {
	// 匿名函数声明方式一
	a := func() {
		fmt.Printf("shit")
	}
	a()

	// 匿名函数声明方式二
	func(name string) {
		fmt.Println(name)
	}("fuck")
}

匿名函数作为参数传入

func main() {
	work(func() {
		fmt.Println("fuck")
	})
}

func work(f func())  {
	fmt.Println("shit")
	f()
}

闭包

经典闭包,只要匿名函数使用外部函数任意一个变量,那么该变量就会一直存在(和 js 闭包概念一致)

func add() func() int {
	x := 100
	return func() int {
		x++
		return x
	}
}

延迟执行 defer

加了 defer 修饰的语句会在当前函数正常语句执行完毕后才执行;
加 defer 的语句按照 LIFO 原则

func main() {
	// 序号表示执行顺序
	defer fmt.Println("第一个入栈") // 3
	fmt.Println("正常输出")        // 1
	defer fmt.Println("第二个入栈") // 2
}

方法

说白了,就是为一个结构体添加额外的方法

但是一个方法不可以直接调用,比如下方代码直接 hello() 是报错的(即可以认定该方法是绑定于结构体上的一部分)

import "fmt"

type Person struct {
	name string
}

// 这是一个方法
// 为结构体扩展一个新的方法
func (p Person) hello() {
	fmt.Println(p.name)
}

func main() {
	p := Person{name: "shit"}
	// 使用刚刚扩展的新方法
	p.hello()
}

接口

和 java 的接口如出一辙

// Dog 定义结构体
type Dog struct {
	name string
}
// 定义接口,需要后续实现
type Animal interface {
	walk()
}

// 实现接口,这里被扩展的结构体为Dog
func (d Dog) walk() {
	fmt.Println("开始走路")
}

// 实例化dog,然后调用对应接口即可
func main() {
	dog := Dog{name: "shit"}
	dog.walk()
}

相关文章:

  • 【JavaEE初阶】第五节.多线程 ( 基础篇 ) 线程安全问题(上篇)
  • Java技能树-操作符(二)-练习篇
  • 化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得
  • 用通知-等待机制优化锁等待问题
  • 微电网(风、光、储能、需求响应)【Simulink 仿真实现】
  • Mysql安全之权限用户管理参考手册
  • C语言萌新如何使用printf函数?
  • 【Kotlin】类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )
  • [网鼎杯 2020 青龙组]AreUSerialz
  • Windows 服务器刷题(带答案)
  • docker入门(二):docker的常用命令
  • colab 如何释放gpu显存?
  • CANoe-仿真总线上的红蓝线、“CANoe DEMO“ license下的软件限制
  • SpringBoot 参数接收只看这一篇文章就够了
  • Vector - VT System - 模拟IO板卡_VT2816
  • 云原生|kubernetes|2022年底cks真题解析(1-10)
  • 7个实用的DTC品牌出海营销策略,打造强大的品牌竞争力
  • 浅谈Android下的注解
  • 【初阶数据结构】——写了将近 5 万字,终于把 二叉树 初阶的内容讲清楚了
  • c++通讯录管理系统
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展
  • 双拥主题歌曲MV:爱我人民,爱我军
  • 今年五一,贵州一脸“爆相”
  • 神二十发射时间藏着两彩蛋:恰逢东方红一号发射55周年和第十个“中国航天日”
  • 【社论】上海车展40年,见证了什么
  • 西安一男子在闲鱼卖手机卷入电诈案,不愿前往异地接受调查被列网逃