【Java转Go】快速上手学习笔记(二)之基础篇一

目录

  • 创建项目
    • 数据类型
    • 变量常量
    • 类型转换
    • 计数器
    • 键盘交互
    • 流程控制
    • 代码
    • 运算符

创建项目

上篇我们安装好了Go环境,和用IDEA安装Go插件来开发Go项目:【Java转Go】快速上手学习笔记(一)之环境安装篇 。

这篇我们开始正式学习Go语言。我是看B站的视频边学边看着视频敲代码的,所以代码笔记也是按照视频讲的顺序来写的。

(然后还有个点需要说明一下,就是我这个笔记应该是只适合有其他编程语言基础的人看,如果没有其他语言基础,还是要找视频或资料系统的学习)

首先是创建一个项目:

在这里插入图片描述
在这里插入图片描述

项目创建好后,new一个Go File。
在这里插入图片描述

数据类型

这里先说一下go的数据类型,主要分为四大类:布尔类、数字类、字符串类、派生类

布尔类就是true、false;数字类就是浮点数和整型;字符串类就字符串咯;派生类就比较多了,包括了指针类型(Pointer)、 数组类型、结构化类型(struct)、Channel 类型、函数类型、切片类型、接口类型(interface)、 Map 类型

在这里插入图片描述

go中,所有数据类型都有一个默认值(零值),整型、浮点默认值是0,字符串类型默认是空字符串,布尔类型默认是false。

变量常量

在这里插入图片描述

package main

import "fmt"

// 这里是全局变量
var num int = 100

/*
这个是main函数,这是go语言启动的入口
*/
func main() {
	fmt.Print("hello!world!") // 不换行打印
	fmt.Println("我是符华呀~")     // 换行打印
	fmt.Println("我是" + "符华呀") // 字符串连接,用+实现,打印的是:我是符华呀~

	// var 变量名 数据类型
	var name string = "符华" // 定义一个字符串变量
	var age int = 20       // 定义一个int变量
	name = "赤鸢"            // 改变name变量的值
	fmt.Println(name, age) // 打印name和age值,多个值直接用逗号隔开
	
	// 不过像版本较高的sdk,其实定义变量的时候,不用指定数据类型也可以,会自动识别,例如:
	//var name,age,a,b = "符华",20,1.56,true
}

在这里插入图片描述

注意,Go语言是不用写分号的(编译的时候会默认帮我们加分号),一行就是在最后默认加一个分号,一句代码就是一行,不可以把多句代码写在一行。

在这里插入图片描述

不过要是非得写一行,一句代码用分号分隔也是可以的,但是不建议这么写。而且我用的idea,我这么写后,会自动帮我格式化分成两行并且把分号去掉了。

在这里插入图片描述
当我们要拼接一个长字符串的时候,需要换行,这时,我们需要把换行的加号保留在上一行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
除了用var声明变量外,还可以用 := 声明短变量。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类型转换

go中,基本数据类型的类型转换必须显示转换(强制转换),不能自动转换。 转换的表达式:T(v),T表示数据类型,v表示要转换的变量。转换时,被转换的是变量存储的值,变量本身的数据类型并没有发生变化。

在这里插入图片描述
其他类型转string,使用 fmt.Sprintf
在这里插入图片描述
在这里插入图片描述

计数器

在这里插入图片描述

键盘交互

在这里插入图片描述

流程控制

流程控制语句:if、switch、for

if这个没啥好说的,就是 if、else、else if,这个和Java一样。

在这里插入图片描述

在这里插入图片描述

代码

上面说到的代码全在这里了,大家可以复制下来,自己从上到下一个一个去执行一遍(放开注释),加深下印象。

package main

import (
	"fmt"
)

// 这里是全局变量
var num int = 100

/*
这个是main函数,这是go语言启动的入口
*/
func main() {
	fmt.Print("hello!world!") // 不换行打印
	fmt.Println("我是符华呀~")     // 换行打印
	fmt.Println("我是" + "符华呀") // 字符串连接,用+实现,打印的是:我是符华呀~

	// var 变量名 数据类型
	//var name string = "符华" // 定义一个字符串变量
	//var age int = 20       // 定义一个int变量
	//name = "赤鸢"            // 改变name变量的值
	//fmt.Println(name, age) // 打印name和age值,多个值直接用逗号隔开

	// 不过像版本较高的sdk,其实定义变量的时候,不用指定数据类型也可以,会自动识别,例如:
	//var name,age,a,b = "符华",20,1.56,true

	// 字符串除了用双引号,还可以用反单引号,也就是 `这里是内容`
	// 当我们有一个比较复杂的字符串时,用双引号遇到特殊字符需要转义,而且拼接比较麻烦,这时我们可以用反单引号
	var str = "abc\nabc"
	str = `abc\nabc`
	str = `
		package main
		import "fmt"
		func main() {
			fmt.Print("hello!world!") // 不换行打印
			fmt.Println("我是符华呀~")     // 换行打印
			fmt.Println("我是" + "符华呀") // 字符串连接,用+实现,打印的是:我是符华呀~
			var name string = "符华" // 定义一个字符串变量
			var age int = 20       // 定义一个int变量
			fmt.Println(name, age) // 打印name和age值,多个值直接用逗号隔开
		}
	`
	fmt.Println(str)

	/*
		定义多个变量
	*/
	//var (
	//	name     string
	//	age      int
	//	addreass string
	//)
	//name = "符华"
	//age = 20
	//addreass = "惠州市"
	//fmt.Println(name, age, addreass)

	/*
		短变量初始化声明,推导声明写法,可以用 := 自动识别变量类型,全局变量不能用短变量定义
		只能在函数内部使用,不能随便到处声明。由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量。
	*/
	//var name = "李四" // 不能先用var声明了变量后,又用 := 去声明
	//name := "张三"
	//age := 20
	//name = "符华"
	//fmt.Println(name, age)
	//fmt.Printf("%T,%T", name, age) // 按照指定的格式输出,这里%T意思的类型,也就是打印这两个变量的类型

	//var num int = 100
	//fmt.Printf("num:%d,内存地址:%p", num, &num) // %d表示数字,%p表示变量内存地址,然后取内存地址用 &变量名
	//num = 200
	//fmt.Printf("num:%d,内存地址:%p", num, &num)

	/*
		变量的交换
	*/
	//var a int = 100
	//var b int = 200
	//b, a = a, b
	//fmt.Println(a, b)

	/*
		自增、自减:自增、自减只能作为表达式使用,而不能用于赋值语句。
	*/
	//a := 1
	//a++
	//a--
	//var b int
	b = a++ // 这里是错误的用法
	//fmt.Println(b)

	/*
		匿名变量,用 _ 表示,本身是一个特殊标识符,被称为空白标识符,表示任何类型都可以赋值给它,但任何赋值都将被抛弃
		使用匿名变量时,只需要在变量声明的地方使用下划线替换即可。
	*/
	//a, _ := test() // 只需要取第一个返回值,所以第二个返回值用匿名变量接收
	//_, b := test() // 只需要取第二个返回值,所以第一个返回值用匿名变量接收
	//fmt.Println(a, b)

	/*
		常量定义
	*/
	//const name1 string = "常量1" // 显式定义
	//const name2 = "常量2"        // 隐式定义
	//const a, b, c = 3.14, "符华", false
	//fmt.Println(name1)
	//fmt.Println(name2)
	//fmt.Println(a, b, c)

	/*
		计数器:iota,每次在const关键字出现时,将被重置为0,const中每新增一行常量声明将使iota计数一次(+1)
	*/
	//const (
	//	a = iota  // 默认iota=0
	//	b         // iota=1
	//	c         // iota=2
	//	d = "hhh" // 输出hhh,但是iota会继续计数,iota=3
	//	e         // 输出hhh,iota=4
	//	f = iota  // iota=5
	//	g = iota  // iota=6
	//	h         // iota=7
	//	i = "hhh" // 输出hhh,iota=8
	//)
	//const (
	//	j = iota // 这里iota将重置为0
	//	k        // iota=1
	//)
	//fmt.Println(a, b, c, d, e, f, g, h, i, j, k)

	//var isFlag bool = true
	//fmt.Printf("%T\n%t\n", isFlag, isFlag)
	//var f1 float64 = 3.14
	//fmt.Printf("%T,%.2f\n", f1, f1) // %f表示输出对应浮点数值,%.2f表示保留两位小数(四舍五入)
	//var str string = "字符串"
	//fmt.Printf("%T,%s\n", str, str) // %s表示输出对应字符串值
	//v1 := 'A'
	//v2 := "A"
	//fmt.Printf("%T,%d\n", v1, v1)
	//fmt.Printf("%T,%s\n", v2, v2)

	/*
		类型转换:基本数据类型的类型转换必须显示转换(强制转换),不能自动转换。
		转换的表达式:T(v),T表示数据类型,v表示要转换的变量。转换时,被转换的是变量存储的值,变量本身的数据类型并没有发生变化。
	*/
	//a := 5.52
	//b := 3
	//c := int(a)
	//d := float64(b)
	//fmt.Printf("%T\n", a)
	//fmt.Printf("%T\n", b)
	//fmt.Printf("%T\n", c)
	//fmt.Printf("%T\n", d)

	// 其他类型转string
	num1 := 100    // 整型
	num2 := 100.23 // 浮点
	isFlag := true // 布尔
	char := 'a'    // char
	var str string
	str = fmt.Sprintf("%d", num1)
	fmt.Printf("类型=%T,值=%v\n", str, str)
	str = fmt.Sprintf("%f", num2)
	fmt.Printf("类型=%T,值=%v\n", str, str)
	str = fmt.Sprintf("%t", isFlag)
	fmt.Printf("类型=%T,值=%v\n", str, str)
	str = fmt.Sprintf("%c", char)
	fmt.Printf("类型=%T,值=%v\n", str, str)
	// string转其他类型,用 strconv 包下对应的函数,如:ParseBool()、ParseInt()、ParseFloat

	/*
		输入:键盘交互
	*/
	//var x int
	//var y float64
	//fmt.Println("请输入两个数 1、整数 2、浮点数")
	 通过操作地址,将输入的值赋值给变量
	//fmt.Scanln(&x, &y) // 等待键盘输入
	//fmt.Println(x, y)
	//fmt.Println("请输入一个字符串")
	 在io中,可以使用bufio包来读取输入的内容
	//reader := bufio.NewReader(os.Stdin)
	//s1, _ := reader.ReadSlice('\n')
	//fmt.Println("读出的内容为:", s1)

	/*
		局部变量
	*/
	//temp := 100           // func函数体里的局部变量
	//if b := 1; b <= 100 { // 这里定义了一个b变量,只作用于if语句里面
	//	temp := 50        // 这定义的是if语句内的局部变量,到了if语句外是不能使用的
	//	fmt.Println(temp) // 局部变量,就近原则
	//	fmt.Println(b)
	//}
	//fmt.Println(temp) // 这打印的是100
	//fmt.Println(num)

	/*
		switch:每写一个case,不用写break,除非使用了fallthrough穿透
	*/
	//a := false
	//switch a {
	//case false:
	//	fmt.Println("1、case条件为false")
	//	fallthrough // case穿透,不管下一个case的条件是否满足,都会执行
	//case true:
	//	if a == false {
	//		break // 中止case穿透
	//	}
	//	fmt.Println("2、case条件为true")
	//}

	//var score int = 90
	//switch score {
	//case 90:
	//	fmt.Println("A")
	//	fallthrough // case穿透,不管下一个case的条件是否满足,都会执行
	//case 80:
	//	fmt.Println("B")
	//	fallthrough
	//case 50, 60, 70:
	//	fmt.Println("C")
	//default:
	//	fmt.Println("D")
	//}

	/*
		for循环
	*/
	// 计算1到10的数字之和
	//sum := 0
	//for i := 1; i <= 10; i++ {
	//	sum += i
	//}
	//fmt.Println(sum)
	// 无限循环
	//for {
	//	fmt.Println(0)
	//}
	//for j := 0; j < 5; j++ {
	//	for i := 0; i < 5; i++ {
	//		fmt.Print("* ")
	//	}
	//	fmt.Println()
	//}
}

运算符

关于运算符这里,我没有记代码(没啥好记的),所以我在这就直接去某个学习网站截图了🤪
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面几个运算符,没啥好说的,不过关于自增、自减有个地方需要注意,就是:Go 的自增、自减只能作为表达式使用,而不能用于赋值语句。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其他运算符这个关于指针变量,我下一篇会写。下一篇讲函数、函数类型、值传递、引用传递、切片、指针、匿名函数、回调函数、泛型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/79162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【新知测评实验室】解谜扫描全能王——“智能高清滤镜”黑科技

目录 一、“智能高清滤镜” 原理分析1.1、智能扫描引擎AI-Scan功能拆解1.1.1、**图像感知**1.1.2、场景化决策 1.2、版面还原与识别技术分析1.2.1、元素检测和识别1.2.2、元素聚合1.2.3、版面识别 二、深度测评——“智能高清滤镜”功能2.1、图像处理方面2.2、摩尔纹去除方面2.…

【C++类和对象】类有哪些默认成员函数呢?(下)

文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…

ffmepg滤镜

代码实现&#xff1a; 1.get_format() 这个是QSV硬件解码时的回调函数&#xff0c;在这里初始化hw_frames_ctx, get_format会在解码时被调用。因此对滤镜的初始化init_filter()应在得到第一帧数据后调用。 2.hw_frames_ctx&#xff0c;需要按照要求把他们传给对应的filter 3.然…

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

OPPO A57刷机资源(附简略教程)

https://www.123pan.com/s/hcAqVv-fpHWd.html提取码:buAp 图中画框的为必须下载的&#xff08;xiaomiflash和twrp必须解压后使用&#xff09; ​ 打开xiaomiflash点击driver点击install&#xff08;就是框住的按钮&#xff09;等待安装完成 ​用数据线将oppo a57与电脑连接&a…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是&#xff0c;尽管"逻辑回归"名字带有“回归”二字&#xff0c;但逻辑回归是一个分类算法&#xff0c;而不是回归算法。 我认为&#xff…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件&#xff0c;但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点&#xff1a; &#xff08;1&#xff09;如何显示成树形。即&#xff0c;子节点如何有缩进。 先计算好…

一、进入sql环境,以及sql的查询、新建、删除、使用

1、进入sql环境 》》》mysql -u root -p 》》》输入密码 2、sql语言的分类 3、注意事项&#xff1a; 4、基础操作&#xff1a; &#xff08;1&#xff09;查询所有数据库&#xff1a; show databases; 运行结果&#xff1a; &#xff08;2&#xff09;创建一个新的数据库&…

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

从SaaS到RPA,没有真正“完美”的解决方案!

众所周知&#xff0c;SaaS行业越来越卷&#xff0c;利润也越来越“薄”&#xff0c;这是传统软件厂商的悲哀&#xff0c;也是未来数字化行业不得不面对的冷峻现状之一。 随着基于aPaaS、低代码的解决方案之流行&#xff0c;SaaS行业变得越来越没有技术门槛&#xff0c;IT人员的…

win10安装mysql和c++读取调用举例

一、下载mysql8.rar解压到C盘(也可以解压到其他位置) 在系统环境变量添加JAVA_HOMEC:\myslq8&#xff0c;并在path中添加%JAVA_HOME%\bin; 二、以管理员身份进入命令窗口 三、修改配置文件指定安装路径和数据库的存放路径 四、键入如下命令初始化并启动mysql服务,然后修改登录…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常&#xff0c;但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser 首先把闪电浏览器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…

Eclipse使用插件时提示Plugin Error loading shared libraries

项目场景: 使用Eclipse的过程中,依赖openCONFIGURATOR插件进行新建项目时,弹出如下的错误: Plugin Error loading shared libraries 以及具体的信息为: Can’t find dependent libraries 这里我使用的插件为openCONFIGURATOR插件 问题描述 如上场景,提示缺少动态链接库…

实战篇之基于二进制思想的用户标签系统(Mysql+SpringBoot)

一&#xff1a; 计算机中的二进制 计算机以二进制表示数据&#xff0c;以表示电路中的正反。在二进制下&#xff0c;一个位只有 0 和 1 。逢二进一 位。类似十进制下&#xff0c;一个位只有 0~9 。逢十进一位。 二&#xff1a; 进制常用运算 &#xff08;位运算&#xff09;…

Django框架 靓号管理(增删改查)

Django框架 靓号管理&#xff08;增删改查&#xff09; 新建一个项目 backend 使用pycharm创建app startapp app项目目录 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…

【设计模式】抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责创建一个相关对象…

Jenkins改造—nginx配置鉴权

先kill掉8082的端口进程 netstat -natp | grep 8082 kill 10256 1、下载nginx nginx安装 EPEL 仓库中有 Nginx 的安装包。如果你还没有安装过 EPEL&#xff0c;可以通过运行下面的命令来完成安装 sudo yum install epel-release 输入以下命令来安装 Nginx sudo yum inst…

神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释

概念 逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数&#xff0c;使得预测结果尽可能接近实际观测。 理解 在逻辑回归中&#xff0c;常用的损失函数是对数似然损失&#xff08;Log-Likelihood Loss&#xff09;&#xff…
最新文章