Golang学习笔记20240725,Go语言基础语法

news2024/11/17 8:53:21

第一个Go程序

package main

import "fmt"

func main() {
	fmt.Println("hello world")
}

运行方式1:

go run main.go

运行方式2:

go build
.\hello_go.exe

在这里插入图片描述

运行方式3:goland右键运行
在这里插入图片描述

字符串拼接

使用加号可以对字符串进行拼接。

package main

import "fmt"

func main() {
	fmt.Println("hello world" + "你好世界")
}

变量的声明和初始化

package main

import "fmt"

func main() {
	var a, b, c int

	a = 11
	b = 22
	c = 333

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}

简短的声明

上面的变量定义和初始化有更简单的方式,如下:

package main

import "fmt"

func main() {
	a := 11
	b := 22
	c := 333

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}

格式化输出

使用%d可以在字符串中格式化输入整数类型,如下:

package main

import "fmt"

func main() {
	a := 11
	b := 22
	c := 333

	fmt.Printf("a=%d, b=%d, c=%d\n", a, b, c)
}

if语句

if语句主要有三种格式,如下:

package main

import "fmt"

func main() {
	a := 33

	// 单分支
	if a > 0 {
		fmt.Println(a)
	}

	// 双分支
	if a < 0 {
		fmt.Println(a)
	} else {
		fmt.Println(a + a)
	}

	// 多分支
	if a > 100 {
		fmt.Println(a)
	} else if a > 0 {
		fmt.Println(a + a)
	} else {
		fmt.Println(a + a + a)
	}
}

for循环

累加求和:

package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 101; i++ {
		sum += i
	}
	fmt.Println(sum)
}

双重for循环打印九九乘法表

package main

import "fmt"

func main() {
	for i := 1; i < 10; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d * %d = %d\t", j, i, i*j)
		}
		fmt.Println()
	}
}

for遍历数组

package main

import "fmt"

func main() {
	arr := []int{11, 22, 33}
	for k, v := range arr {
		fmt.Println(k, v)
	}
}

for 遍历字符串

package main

import "fmt"

func main() {
	arr := "abc"
	for k, v := range arr {
		fmt.Println(k, v)
	}
}

for遍历字典

package main

import "fmt"

func main() {
	arr := map[string]int{"one": 1, "two": 2, "three": 3}
	for k, v := range arr {
		fmt.Println(k, v)
	}
}

for 遍历管道

package main

import "fmt"

func main() {
	c := make(chan int)
	go func() {
		c <- 33
		c <- 333
		c <- 333333
		close(c)
	}()

	for v := range c {
		fmt.Println(v)
	}
}

匿名变量

如果我们在遍历的时候,不想要key或者value,也可以用下划线替代,下划线叫做匿名变量。

package main

import "fmt"

func main() {
	c := []int{1, 2, 3}

	for _, v := range c {
		fmt.Println(v)
	}
}

switch 语句

go语言里面的switch语句每个case天生就是独立的,不需要加break。

package main

func main() {
	s := "python"

	switch s {
	case "python":
		print("1")
	case "go":
		print("2")
	case "java":
		print("3")
	default:
		print("4")
	}
}

switch 可以一个分支捕获多个值

这个是go语言的特点,很少在其他语言看见,我们来看例子:

package main

func main() {
	s := "python"

	switch s {
	case "python", "go", "java":
		print("1")
	default:
		print("4")
	}
}

switch的分支可以捕获条件判断

这个也是go语言的特点,我们来看例子:

package main

func main() {
	s := 33

	switch {
	case s > 0 || s < 100:
		print("1")
	default:
		print("4")
	}
}

字符串可以通过索引访问字符

package main

func main() {
	s := "abcde"
	print(s[0])
}

字符串可以通过切片访问连续字符

package main

func main() {
	s := "abcde"
	print(s[0:3])
}

统计字符串的个数要用特殊的方法

package main

import "unicode/utf8"

func main() {
	s := "abcde"
	print(utf8.RuneCountInString(s))
}

将字符编码转换为字符

package main

func main() {
	s := "abcde"
	print(string(s[1]))
}

遍历字符串的每一个字符

package main

import "fmt"

func main() {
	s := "我 爱 你 中 国"
	cs := []rune(s)
	for _, ch := range cs {
		fmt.Println(string(ch))
	}
}

使用buffer累加字符串

package main

import (
	"bytes"
	"fmt"
)

func main() {
	var bf bytes.Buffer
	for i := 0; i < 10; i++ {
		fmt.Fprintf(&bf, "a%d ", i)
	}
	s := bf.String()
	fmt.Println(s)
}

通过指针修改变量的值

指针可以直接对内存地址进行操作。使用*表示指针,使用&取地址。

package main

import "fmt"

func main() {
	a := 33

	pa := &a
	*pa = 333

	fmt.Println(a)
	fmt.Println(*pa)
}

使用指针交换两个变量的值

package main

import "fmt"

func swap(a, b *int) {
	*a, *b = *b, *a
}

func main() {
	a, b := 33, 11
	fmt.Println(a, b)

	swap(&a, &b)
	fmt.Println(a, b)
}

数组的基本使用

package main

import "fmt"

func main() {
	// 声明
	var arr [8]int

	// 赋值
	for i := 0; i < 8; i++ {
		arr[i] = i * 33
	}

	// 遍历
	for i := 0; i < 8; i++ {
		fmt.Println(arr[i])
	}
}

结构体的基本用法

package main

import "fmt"

type User struct {
	Name string
	Age  int
}

func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}

	fmt.Println(zs, ls)
}

结构体作为函数参数

package main

import "fmt"

type User struct {
	Name string
	Age  int
}

func printUser(u User) {
	fmt.Printf("姓名:%s 年龄:%d \n", u.Name, u.Age)
}

func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}

	printUser(zs)
	printUser(ls)
}

结构体指针作为函数参数

package main

import "fmt"

type User struct {
	Name string
	Age  int
}

func printUser(u *User) {
	fmt.Printf("姓名:%s 年龄:%d \n", u.Name, u.Age)
}

func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}

	printUser(&zs)
	printUser(&ls)
}

切片的增删改查

切片在go语言里面非常常用,因为其有动态扩展的特性。

package main

import "fmt"

func main() {
	var arr []int

	// 增加
	arr = append(arr, 11)
	arr = append(arr, 22)
	arr = append(arr, 33)

	// 删除 索引1
	index := 1
	arr = append(arr[:index], arr[index+1:]...)

	// 修改
	arr[0] = 888

	// 遍历
	for _, v := range arr {
		fmt.Println(v)
	}
}

map的增删改查

package main

import "fmt"

func main() {
	var m = make(map[string]int)

	// 增加
	m["a"] = 11
	m["b"] = 12
	m["c"] = 13

	// 删除
	delete(m, "a")

	// 修改
	m["c"] = 888

	// 遍历
	for k, v := range m {
		fmt.Println(k, v)
	}
}

加法函数

package main

import "fmt"

func add(a, b int) int {
	return a + b
}

func main() {
	fmt.Println(add(1, 2))
}

函数的可变参数

package main

import "fmt"

func add(arr ...int) int {
	sum := 0
	for i := 0; i < len(arr); i++ {
		sum += arr[i]
	}
	return sum
}

func main() {
	fmt.Println(add(1, 2))
	fmt.Println(add(1, 2, 3, 4, 5))
}

匿名函数

package main

import "fmt"

func main() {
	defer func() {
		fmt.Println("这个是匿名函数")
	}()
	fmt.Println("xxx")
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构初阶 · 二叉搜索树

目录 前言: 二叉搜索树的实现 二叉搜索树的基本结构 增 查 中序遍历 删 前言: 在最初学习二叉树的时候&#xff0c;就提及到过单独用树来存储数据是既不如链表也不如顺序表的&#xff0c;二叉树的用处可以用来排序&#xff0c;比如堆排序&#xff0c;也可以用来搜索数据…

雷军的逆天改命与顺势而为

雷军年度演讲前&#xff0c;朋友李翔提了一个问题&#xff1a;雷军造车是属于顺势而为还是逆势而为&#xff1f;评论互动区有一个总结&#xff0c;很有意思&#xff0c;叫“顺势逆袭”。 大致意思是产业趋势下小米从手机到IOT再切入汽车&#xff0c;是战略的必然&#xff0c;不…

学习Java的日子 Day58 Servlet的生命周期,安全问题,页面跳转,中文乱码问题

Day58 1.Servlet的生命周期 创建&#xff1a;第一次发送给该Servlet请求时 ​ 调用&#xff1a;构造方法、init() 销毁&#xff1a;服务器正常关闭 ​ 调用&#xff1a;destroy() Welcome.html 没有明确写出是什么请求&#xff0c;那就是get请求 <!DOCTYPE html> <ht…

JavaWeb笔记_JSTL标签库JavaEE三层架构案例

一.JSTL标签库 1.1 JSTL概述 JSTL(jsp standard tag library):JSP标准标签库,它是针对EL表达式一个扩展,通过JSTL标签库与EL表达式结合可以完成更强大的功能 JSTL它是一种标签语言,JSTL不是JSP内置标签 JSTL标签库主要包含: ****核心标签 格式化标签 …

7月25日JavaSE学习笔记

线程的生命周期中&#xff0c;等待是主动的&#xff0c;阻塞是被动的 锁对象 创建锁对象&#xff0c;锁对象同一时间只允许一个线程进入 //创建锁对象Lock locknew ReentrantLock(true);//创建可重入锁 可重入锁&#xff1a;在嵌套代码块中&#xff0c;锁对象一样就可以直接…

分享几种电商平台商品数据的批量自动抓取方式

在当今数字化时代&#xff0c;电商平台作为商品交易的重要渠道&#xff0c;其数据对于商家、市场分析师及数据科学家来说具有极高的价值。批量自动抓取电商平台商品数据成为提升业务效率、优化市场策略的重要手段。本文将详细介绍几种主流的电商平台商品数据批量自动抓取方式&a…

PP 三 pp字段含义

单位&#xff1a;生产&#xff0c;销售&#xff0c;采购的单位&#xff0c;和基本单位会存在不一样的情况&#xff0c;所以要进行一个转换 产品组&#xff0c;普通项目类别组&#xff1a;销售来确定 跨工厂物料状态&#xff1a;如果在基本数据1里面&#xff0c;则是跨集团的&…

Kafka知识总结(分区机制+压缩机制+拦截器+副本机制)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 分区机制 分区策略 分区策略是决定生产者将消息发送到哪个分区的…

WPF---Prism视图传参

Prism视图传参方式。 实际应用场景 点击tabitem中的列表数据&#xff0c;同步更新到ListStatic Region对应的界面。目前用两种方式实现了传参数据同步。 第一&#xff0c;事件聚合器&#xff08;EventAggregator&#xff09; 1. 定义事件 创建一个事件类&#xff0c;用于传…

05 循环神经网络

目录 1. 基本概念 2. 简单循环网络 2.1 简单循环网络 2.2 长程依赖问题 3. 循环神经网络的模式与参数学习 3.1 循环神经网络的模式 3.2 参数学习 4. 基于门控的循环神经网络 4.1 长短期记忆网络 4.2 LSTM网络的变体网络 4.3 门控循环单元网络 5. 深层循环神经网络…

算法第十五天:leetcode19.删除链表的倒数第N个节点

一、删除链表的倒数第N个节点的题目描述与链接 19.删除链表的倒数第N个节点的链接如下表所示&#xff0c;您可直接复制下面网址进入力扣学习&#xff0c;在观看下面的内容之前您一定要先做一遍哦&#xff0c;以便让我印象更深刻&#xff01;&#xff01;!https://leetcode.cn/p…

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

电离层——科普

电离层的发现 图1 电离层区域示意图 在地球上空大约60km至1000km范围内有一个特殊的区域。因为它的存在,使无线电通信成为现实,同时它又是GPS定位的捣乱鬼,它就是电离层。 电离层的发现 1901年,扎营守候在加拿大信号山的意大利科学家马可尼用风筝价高接收天线,接收到了从英格…

【Android】碎片—动态添加、创建Fragment生命周期、通信

简单用法 在一个活动中添加两个碎片&#xff0c;并让这两个碎片平分活动空间 先新建一个左侧碎片布局和一个右侧碎片布局 左侧碎片 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/…

智慧工地视频汇聚管理平台:打造现代化工程管理的全新视界

一、方案背景 科技高速发展的今天&#xff0c;工地施工已发生翻天覆地的变化&#xff0c;传统工地管理模式很容易造成工地管理混乱、安全事故、数据延迟等问题&#xff0c;人力资源的不足也进一步加剧了监管不到位的局面&#xff0c;严重影响了施工进度质量和安全。 视频监控…

LLM及GPT知识点

工欲善其事必先利其器&#xff0c;在了解大语言模型和GPT之前先要了解基本概念。 LLM Large Language Model (LLM) 即大型语言模型&#xff0c;也叫大语言模型&#xff0c;是一种基于深度学习的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它能够学习自然语言的语…

【Django】django模板与前端技术(html模板)

文章目录 “python包html”还是“html包python”?1.新建模板2.模板语法3.views.py测试 “python包html”还是“html包python”? 在前端页面中html代码比python多得多&#xff0c;所以一定是html包python最优&#xff01;于是引出今天的模板。 大体分为三个步骤&#xff1a;…

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…

什么是数据标注?

什么是数据标注&#xff1f; 数据标注是在原始数据上添加结构化信息的过程&#xff0c;这些信息通常以标签或元数据的形式存在&#xff0c;目的是让机器能够理解和“学习”数据的特征&#xff0c;从而提高算法的准确性和效率。 数据标注是机器学习和人工智能开发中不可或缺的一…

网络地址转换技术

一、实验日期与地址 1、实验日期&#xff1a;2024年xx月xx日 2、实验地址&#xff1a;xxx 二、实验目的 1、理解源NAT应用场景及原理&#xff1b; 2、掌握NAT Server的配置方法&#xff1b; 3、掌握NAT双出口的配置方法&#xff1b; 4、掌握域内NAT的配置方法。 三、实…