IDEA 配置Go环境,编写Golang代码,学习笔记(一)

2023-10-31

Hello,各位小伙伴们,又有一段时间没有更新了,老哥呢,最近去外面面试,发现Java已经是卷得不能在卷了,老哥没有办法,只能另辟蹊径,去卷Go,现在可以说又回到原点了。

诶,世事无常,大肠包小肠。

跟着Jessica老哥学习Golang

搭建Go环境

1、老哥这篇文章,需要读者有一定的编程基础,一些基本的语法我不会讲,节省篇幅。还望见谅

2、windows下载,Golang 官方下载地址
在这里插入图片描述

3、下载完成以后,安装,选择一个合适的位置,环境变量可以配置一下,现在最新的版本好像已经默认帮你配置好了,可以通过命令查看是否配置完成,然后输入以下两行命令

GO111MODULE   golang最新的模块化编程

GOPROXY     golang的代理,很多插件在国外Github上面,我们设置一个镜像拉取,方便一些

D:\>go version
go version go1.18.4 windows/amd64
D:\>go env -w GO111MODULE=on

D:\>go env -w GOPROXY=https://goproxy.io,direct

4、启动IDEA,在settings里面搜索 plugins,安装Go插件
在这里插入图片描述
5、如果搜不到,可能是你的IDEA插件源没有更新,去这里修改
在这里插入图片描述
6、新建一个项目gostudy,没有配置Go的安装路径需要配置一下
在这里插入图片描述
7、最好放在src目录下
在这里插入图片描述
8、进入工程以后,我们需要设置一下控制台输出,按住ctrl+shift+A,如果按不了,可能是快捷键冲突了,需要你们把输入法、其他无关软件先退出再试一下,为了控制台输出更加清晰,没有多余的内容,找到go.run.process.with.pty这个属性,取消勾选

在这里插入图片描述
9、新建一个test包,然后编写代码
在这里插入图片描述
10、如果无法打印,可以在IDEA终端,输入 go init mod +你的项目名字,最后再次测试打印

D:\Learning\Go\project\src\gostudy>go mod init gostudy

golang语法

1、在go语言里面,有main函数的包,包名是main,其他的包则使用当前文件上一级包作为包名

2、需要使用api,用到的是导入,IDEA会自动完成

3、声明变量 可以使用 var xxx = 666,也可以使用 var xxx int =666,也可以使用 xxx := 666,需要注意的是,变量声明在函数中必须使用,如果不使用,就会报错,常量不会

3A、常量使用 const关键字

5、字符串有专门的Api,strings 做各种判断,如果用到截取,需要把字符串当成一个数组,从哪里截取到哪里

6、使用对象,需要用到 type struct 关键字

struct 等同于 java 的class

package main

import (
	"fmt"
	"strings"
)

const Logo = "Jessica老哥学习Go"

func main() {
	//1、打印数组
	arr1 := [...]int {11,26,3}
	fmt.Print(arr1[1])
	//换行
	fmt.Println()

	//2、循环遍历
	for i := 0; i < 10; i++ {
		fmt.Print(i," ")
	}
	fmt.Println()

	//3、字符串判断、截取
	var str="hello world"
	fmt.Print(strings.Contains(str, "h"))
	fmt.Println()
	fmt.Print(str[0:4])
	fmt.Println()

	//3A、对象tostring
	user1 := User{"Jessica,",26}
	fmt.Print(user1)
	fmt.Println()

	//5、构造函数打印对象
	user2 := NewUser("666", 18)
	fmt.Print(user2.name)
	fmt.Println()

	//6、调用一个方法
	fmt.Print(test())
}


func test() string  {
	return "你好呀"
}

type User struct {
	name string
	age int
}

func NewUser(name string, age int) *User {
	return &User{name: name, age: age}
}

7、如果我们需要查看一个对象的类型,或者打印这个对象,可以使用以下代码

package main

import "fmt"

func main() {
    /**
	格式化输出
     */

	//1、数据类型
	dept := Dept{"张三", 15}
    fmt.Printf("%T",dept.name)
    //换行
	fmt.Println()

	//2、输出dept对象
	fmt.Printf("%v",dept)
	fmt.Println()

	//3、输出包名和类名+对象数据
	fmt.Printf("%#v",dept)

}

type Dept struct {
	name string
	age int
}

8、数组的遍历 和 条件判断

package main

import (
	"fmt"
)

func main() {
	arr := [...]int{11, 2, 10}

	arr1 := []int{111, 22, 100}

	//数组遍历方式一
	for i := 0; i < len(arr); i++ {
		fmt.Print(arr[i], " ")
	}
	//换行
	fmt.Println()

	//数组遍历方式二,_表示占位符,也可以用index,
	//如果使用了具体的值,必须使用
	for _, value := range arr {
		fmt.Print(value," ")
	}
	fmt.Println()

	//3、动态数组(切片)遍历
	for _, value := range arr1 {
	    fmt.Print(value," ")
	}
    fmt.Println()
	
	//3A、条件判读 if elseif
	for i := 0; i <= 5; i++ {
		if i%3 == 0 {
			fmt.Print(i, " ")
		} else if i == 5 {
			fmt.Print("等于5,需要停止了")
			break
		}
		//继续下一次循环
		continue
	}
	fmt.Println()

	//5、条件判断 switch case
	i :=2
	switch  i {
	case 1:
		fmt.Print("1")
	case 2:
		fmt.Println("2")
		//后面不符合条件的也会打印
		//fallthrough
	case 3:
		fmt.Println("3")
	}

}

9、动态数组(切片)

package main

import "fmt"

func main() {
   //切片
	var dArr= [] int {3,6,9}
	//取出所有
	fmt.Print(dArr[:]," ")
	fmt.Println()

    //取出一个区间
	fmt.Print(dArr[0:2])
	fmt.Println()

	//因为是动态数组,所以可以CRUD
	//新增
	createArr := append(dArr, 22)
	fmt.Print(createArr)
	fmt.Println()

	//修改
	dArr[0]=30
	fmt.Print(dArr)
	fmt.Println()

	//删除,[3 6 9],删除是这样做的,它先截取0到1的数组,不包括1,然后截取2到后面的数组
	//再拼接到一个新的数组,实现删除
	deleteArr := append(dArr[:1], dArr[2:]...)
	fmt.Print(deleteArr)
	fmt.Println()

	//查询
	for _, value := range dArr {
		fmt.Print(value," ")
	}
	fmt.Println()

	//深拷贝,修改数组dArr2 会同时修改dArr
	//小知识:map slice interface channel 默认是深拷贝
	var dArr2=dArr
	dArr2[0]=300
	fmt.Print(dArr," ")
	fmt.Print(dArr2)
	fmt.Println()

    //浅拷贝,创建一个空数组,需要使用make命令分配地址
	var dArr3 = make([]int,len(dArr))
	//copy 前面表示你要拷贝的新数组,后面是之前的数组
    copy(dArr3, dArr)
	dArr3[0]=3000
	fmt.Print(dArr, " ")
	fmt.Print(dArr3)
}

10、map 存储 key-value数据,查找和遍历

package main

import "fmt"

func main() {
	map1()
	map2()
	map3()
}

func map1()  {
	var m1 = make(map[string]string)
	m1["name"]="tom"
	m1["age"]="20"
    fmt.Print(m1)
	fmt.Println()
}

func map2()  {
	var m2=map[string]string {"name":"Jessica","age":"18"}
	fmt.Println(m2)
}

func map3()  {
	m3 := map[string]int{"id":111,"pid":11,"ppid":1}
	//取出单个key
	fmt.Println(m3["id"])

	//取出所有的key和value
	for index, value := range m3 {
		fmt.Println(index,value)
	}

}

11、函数 func
① golang里面有三种函数,普通函数、匿名函数、写在结构体的函数(闭包)(struct)

② 不允许函数重载

③不允许嵌套普通函数,但是可以嵌套匿名函数

④函数是一个值,可以将函数赋值给一个变量

⑤函数可以作为一个参数传递给另外一个变量

⑥函数的返回值可以是一个函数

package main

import "fmt"

//go语言里面 参数值放前面,参数类型放后面
func sum(a int ,b int ) (result int)  {
	return a+b
}

//go语言暂时不支持三目运算符
func max(compare1 int,compare2 int)  int  {
	if compare1 >compare2{
		return compare1
	}else{
		return compare2
	}
}



//匿名函数
func _()  {
	var n1,n2,n3 =11,2,3
	n4,n5,n6 :=11,22,33

	fmt.Println(n1,n2,n3)
	fmt.Println(n4,n5,n6)

}

func hello(name string) string  {
	return name
}


func sayHello(name string, f func(n string) string)  string {
	 return f(name)
}

func calc(mtype string) (f func(a int, b int) int)  {
	if mtype =="+"{
		return sum
	}else {
		return max
	}
}


func main() {
	//有点接口和实例化的意思
	//f1相当于java的接口
	//max相当于java的实现类
	type f1 func(a int, b int) (result int)

	var ff f1 = sum
	fmt.Println(ff(1, 2))

	ff = max
	fmt.Println(ff(22, 33))

	//2、高阶函数调用一,函数作为参数传递
	fmt.Println(sayHello("你好呀", hello))

	//3、高阶函数调用二,函数作为返回值传递
	resultAdd := calc("+")(66, 34)
	fmt.Println(resultAdd)

    //3A、匿名函数,如果在函数的结尾,加了小括号,并且传了参数
    //等同于自己调用自己
	r :=func(a int, b int) int {
		if a *b == 9 {
			return 1
		}else {
			return 0
		}
	}(3,3)
	fmt.Println(r)

}

12、闭包函数,这个概念有点抽象,个人理解是函数作为返回值后,再次调用参数,它和高阶函数调用二很类似

package main

import "fmt"

//闭包,add不传参数,得到返回值是一个函数,向返回值函数传参是可以的
//如   f :=add()
//     f(10)
func add() func(y int) int  {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}

func main() {
	//1、闭包,不同返回值作用域不同
	f := add()
	fmt.Println(f(10))
	fmt.Println(f(20))
	fmt.Println()

	f1 :=add()
	fmt.Println(f1(20))
	fmt.Println(f1(30))
}

13、递归、defer、init

递归: 自己调用自己

defer: 延迟、逆序加载,先定义的后执行
用途:
① 关闭文件句柄
② 锁资源释放
③ 数据库连接释放

init: 初始化,在main函数前面执行
init 函数没有参数,没有返回值
init 函数可以有多个
init 函数自动执行,无法被调用

在golang语言里面,初始化顺序为 变量初始化 -> init() ->main

package main

import "fmt"

//递归

//方式一
func f1(n int) int {
	var s  =1
	for i := 1; i <= n; i++ {
		s *=i
	}
	return s
}

//方式二
func  f2 (n int) int {
	if n==1 {
		return 1
	}else {
		return n * f2(n-1)
	}
}

//斐波那契数列 递归求和
func f3(n int) int {
	if n == 1 || n == 2 {
		return 1
	}
    // f3(4)+f3(3)
    // f3(3)+f3(2) + f(2)+f(1)
    //f3(2)+f3(1)+ f3(2) + f(2)+f(1) =1+1+1+1+1=5
	return f3(n-1) + f3(n-2)

}


//defer 先加载的后执行  会先执行b的值,再执行a的值
//如 defer a :=1
//   defer b :=2

func deferTest()  {
	fmt.Println("start...")

	defer fmt.Println("step1...")
	defer fmt.Println("step2...")
	defer fmt.Println("step3...")

	fmt.Println("end...")
}

var i int =initVar()

func init()  {
	fmt.Println("init1执行了...")
}

func init()  {
	fmt.Println("init2执行了...")
}

func initVar() int {
	fmt.Println("initVar...")
   return 1
}


func main() {
	fmt.Println(f1(6))
	fmt.Println(f2(6))
	fmt.Println(f3(5))

	deferTest()
}

在这里插入图片描述

14、最后,各位小伙伴们,麻烦给老哥一个点赞、关注、收藏三连好吗,你的支持是老哥更新最大的动力,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IDEA 配置Go环境,编写Golang代码,学习笔记(一) 的相关文章

随机推荐

  • SQLserver 2008数据库迁移 - 导出 方法二 备份法

    前言 由于更换服务器 所以需要对数据库进行备份 到新服务器还原 收到数据库迁移的命令 登上服务器一看 一脸懵B SQLServer 2008完全没用过 于是开始查资料 各种百度 CSDN一顿查 方法一 保存脚本法 点此链接了解详情 方法二
  • keil报错:Symbol set_value multiply define和 incomplete type is not allowed和error:  #65: expected a “;“

    一个是重复定义 一个是不完整类型 一个是缺一个 第一个 重复定义 一般最多的就是两个文件中的变量定义重复而报错 一般这种改一下名就差不多了 而另一种就比较难看出来了 比如 定义一个结构体在sys h的文件中 并在文件中进行了定义和初始化 然
  • Formality流程

    Formality流程 前言 一 formality是什么 二 使用步骤 0 打开formality的gui界面 1 导入svf文件 2 读入verilog文件 3 读入网表文件 4 setup 5 match and verify 6 注
  • 安装 Media Player 11验证最简单的解决方案

    MS说打补丁 我就让它打 结果给我升到了11 还要验证 不爽 搞了半天 最后找到解决方案 好简单将C Program Files Windows Media Player LegitLibM dll改名为legitlib dll 打开Med
  • python网络爬虫模块

    re模块 想在python中使用正则表达式 可以使用re模块来辅助筛选 1 findall 查找数据中所有符合条件的数值 最后的结果以列表形式输出 贪婪匹配 import re res re findall l hello l l 2 fi
  • JavaEE学习 day09

    今天 继续学习了JavaEE 继续做SSM图书管理系统项目 SSM图书管理系统 修改用户 显示修改数据 SSM图书管理系统 修改用户 userid隐藏域 SSM图书管理系统 修改用户 与新增共用一个方法 SSM图书管理系统 删除用户 总结一
  • Python 批量处理PNG、JPG图片 去白边

    每次写论文用seaborn画出来的图白边都很大并且没法调 每次都用PS软件去白边很麻烦 索性写了个脚本 在不改变图片像素密度 尺寸变了 相当于切割 的情况下 批量去掉图片白边 参考了部分网上的程序 自己写了个简单的脚本 放到一个Python
  • python中isalpha的用法_Python string isalpha()用法及代码示例

    在Python中 isalpha 是用于字符串处理的内置方法 如果字符串中的所有字符都是字母 则isalpha 方法返回 True 否则 返回 False 此函数用于检查参数是否包含任何字母字符 例如 ABCDEFGHIJKLMNOPQRS
  • jd抢购工具_Python爬虫教程,京东自动登录,在线抢购商品

    京东抢购 Python爬虫 自动录京东网站 查询商品库存 价格 显示购物车详情等 可以指定抢购商品 自动购买下单 然后手动去京东付款就行 chang log 2017 03 30 实现二维码扫码登陆 2017 06 27 Golang版JD
  • STM32定时器及中断简单程序

    STM32定时器及中断简单 main stm32f103c8t6有3个普通1个高级定时器 每次进入中断服务程序间隔时间为 1 TIM Prescaler 72M 1 TIM Period 1 7199 72M 1 9999 1秒 inclu
  • 内存对齐

    最近为了找工作 狂补了很多基础知识 自以为掌握的不错了 但是真正笔试 面试的时候才发现不懂的知识真得还很多 对很多知识点的掌握和理解都还停留在表层 今天总结一下关于字节对齐的知识 字节对齐在这个找工作季算是被考烂了 笔试考多少次不记得了 面
  • pytest(10): 自定义命令行参数,获取传参

    Hook 方法之 pytest addoption pytest addoption 可以让用户注册一个自定义的命令行参数 方便用户将数据传递给 pytest 这个 Hook 方法一般和 内置 fixture pytestconfig 配合
  • SpringBoot、Cloud自定义线程池

    好处 避免常规线程池出现的OOM和资源浪费 统一管理交与spring 1 开启使用异步注解 EnableAsync 开启spring的异步功能 public class Demo public static void main String
  • uniapp 获取当前页面的高度

  • [恒指赵鑫] 为什么恒指是2019年最火最受欢迎的交易品种?

    前言 如果我们每一个投资人 没有正视我们的投姿的话 那么就最好不要去投资了 一个人的成功来源于他的观念 有什么样的观念 会有什么样的想法 有什么样的想法 会有什么样的行动 选择大于努力 一步错 步步错 哪个期货品种赚钱最快 做哪个期货产品好
  • QQ群怎么快速封群,如何举报骗子QQ群可以使之封群?

    QQ群是个开放式的交流平台 充斥着各色各样的人和行业 不少人都被一些表面光鲜亮丽 背地乌烟瘴气的QQ群吸引过 直到出问题的时候才知道为时已晚 以目前腾讯的审核力度来看 正常举报 封群是极其困难的 就算是非常违规的QQ群 大概率也只是被举报掉
  • Spring Boot获取时间

    运行环境新建测试类 package com wusiyao websockets service import org springframework stereotype Service import java text SimpleDa
  • 二叉树顶上战争实战——手撕数据结构

    目录 传统艺能 1 二叉树最大深度 DFS 分治思想 法 实现 2 单值二叉树 Tree节点数 叶子节点个数 第K层节点数 三大遍历 前序遍历 中序遍历 后序遍历 传统艺能 小编是双非本科大一菜鸟不赘述 欢迎大佬指点江山 QQ 131936
  • Spring Boot 面试现场题

    随着Spring Boot的面世已经有几年了 给程序员带来的最直观的感受是配置减少了 至于Spring Boot的核心功能和原理 很少人能答上来 为了在互联网寒冬中能找到工作 今天根据所学发表下关于spring Boot的愚见 下面以考官和
  • IDEA 配置Go环境,编写Golang代码,学习笔记(一)

    Hello 各位小伙伴们 又有一段时间没有更新了 老哥呢 最近去外面面试 发现Java已经是卷得不能在卷了 老哥没有办法 只能另辟蹊径 去卷Go 现在可以说又回到原点了 诶 世事无常 大肠包小肠 跟着Jessica老哥学习Golang 搭建