GO 语言基础语法一 (快速入门 Go 语言)

news2025/7/17 6:45:19

Go语言基础语法

  • 一. golang 标识符,关键字,命名规则
  • 二. golang 变量
  • 三. golang 常量
  • 四. golang 数据类型
  • 五. golang 布尔类型
  • 六. golang 数字类型
  • 七. golang 字符串
    • 1. go语言字符串字面量
    • 2. go语言字符串连接
      • (1). 使用加号
      • (2). 使用 fmt.Sprintf() 函数
      • (3). strings.Join()
      • (4). buffer.WriteString()
    • 3. go语言字符串转义字符
    • 4. go语言字符串切片操作
    • 5. go语言字符串常用方法
  • 八. golang格式化输出
  • 九. golang运算符
    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 位运算符
    • 5. 赋值运算符
  • 十. golang流程控制
    • 1. if 语句
    • 2. if else 语句
    • 3. if else if 语句
    • 4. 嵌套 if 语句
    • 4. switch语句
    • 5. for 循环语句
    • 6. for range 循环语句

一. golang 标识符,关键字,命名规则

在这里插入图片描述

二. golang 变量

在这里插入图片描述

三. golang 常量

在这里插入图片描述

四. golang 数据类型

在这里插入图片描述

五. golang 布尔类型

在这里插入图片描述

六. golang 数字类型

在这里插入图片描述

七. golang 字符串

1. go语言字符串字面量

在Go语言中,字符串字面量使用双引号 “” 或者反引号 ’ 来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。

package main

import (
	"fmt"
)

func main() {

	var s1 string = "hello world"

	var s2 string = `
		<html>
			<head><title> hello world </title>
		</html>
	
	`

	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("s2: %v\n", s2)
}

运行结果

s1: hello world
s2: 
                <html>
                        <head><title> hello world </title>
                </html>

2. go语言字符串连接

(1). 使用加号

package main

import (
	"fmt"
)

func main() {

	name := "lyp"
	age := "20"
	msg := name + " is " + age

	fmt.Printf("msg: %v\n", msg)

	msg = ""
	msg += name
	msg += " is "
	msg += age

	fmt.Printf("msg: %v\n", msg)

}

运行结果

msg: lyp is 20
msg: lyp is 20

(2). 使用 fmt.Sprintf() 函数

package main

import (
	"fmt"
)

func main() {

	name := "lyp"
	age := "20"
	msg := fmt.Sprintf("%s is %s", name, age)

	fmt.Printf("msg: %v\n", msg)

}

运行结果

msg: lyp is 20

(3). strings.Join()

package main

import (
	"fmt"
	"strings"
)

func main() {

	name := "lyp"
	age := "20"
	msg := strings.Join([]string{name, age}, " is ")

	fmt.Printf("msg: %v\n", msg)

}

运行结果

msg: lyp is 20

(4). buffer.WriteString()

package main

import (
	"bytes"
	"fmt"
)

func main() {

	var buffer bytes.Buffer
	buffer.WriteString("lyp")
	buffer.WriteString(" is ")
	buffer.WriteString("20")

	fmt.Printf("buffer.String(): %v\n", buffer.String())

}

运行结果

buffer.String(): lyp is 20

3. go语言字符串转义字符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示
在这里插入图片描述

package main

import "fmt"

func main() {

	fmt.Printf("hello\tworld\n")

	fmt.Printf("\"c:\\test\\\"")

}

运行结果

hello   world
"c:\test\"

4. go语言字符串切片操作

package main

import "fmt"

func main() {

	str := "hello world"
	n := 3
	m := 5

	fmt.Println(str[n])   //获取字符串索引位置为n的原始字节
	fmt.Println(str[n:m]) //截取得字符串索引位置为 n 到 m-1 的字符串
	fmt.Println(str[n:])  //截取得字符串索引位置为 n 到 len(s)-1 的字符串
	fmt.Println(str[:m])  //截取得字符串索引位置为 0 到 m-1 的字符串

}

运行结果

108
lo
lo world
hello

5. go语言字符串常用方法

在这里插入图片描述

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "hello world!"
	fmt.Printf("len(s): %v\n", len(s))
	fmt.Printf("strings.Split(s, \"\"): %v\n", strings.Split(s, " "))
	fmt.Printf("strings.Contains(s, \"hello\"): %v\n", strings.Contains(s, "hello"))
	fmt.Printf("strings.HasPrefix(s, \"hello\"): %v\n", strings.HasPrefix(s, "hello"))
	fmt.Printf("strings.HasSuffix(s, \"world!\"): %v\n", strings.HasSuffix(s, "world!"))
	fmt.Printf("strings.Index(s, \"l\"): %v\n", strings.Index(s, "l"))
	fmt.Printf("strings.LastIndex(s, \"l\"): %v\n", strings.LastIndex(s, "l"))
}

运行结果

len(s): 14
strings.Split(s, ""): [hello world!]
strings.Contains(s, "hello"): true
strings.HasPrefix(s, "hello"): true
strings.HasSuffix(s, "world!"): true
strings.Index(s, "l"): 2
strings.LastIndex(s, "l"): 9

八. golang格式化输出

在这里插入图片描述

package main

import "fmt"

type WebSite struct {
	Name string
}

func main() {
	site := WebSite{Name: "lyp"}
	fmt.Printf("site: %v\n", site)
	fmt.Printf("site: %#v\n", site)
	fmt.Printf("site: %T\n", site)

	fmt.Println("%%")

	b := true
	fmt.Printf("b: %t\n", b)

	i := 8
	fmt.Printf("i: %v\n", i)
	fmt.Printf("i: %b\n", i)

	i = 96
	fmt.Printf("i: %c\n", i)
	fmt.Printf("i: %x\n", i)

	x := 100
	p := &x
	fmt.Printf("p: %v\n", p)

}

运行结果

site: {lyp}
site: main.WebSite{Name:"lyp"}
site: main.WebSite
%%
b: true
i: 8
i: 1000
i: `
i: 60
p: 0xc000016120

九. golang运算符

1. 算术运算符

在这里插入图片描述

++(自增)和–(自减)在Go语言中是单独的语句,并不是运算符(不能用在表达式中)

package main

import "fmt"

func main() {
	a := 100
	b := 10

	fmt.Printf("(a + b): %v\n", (a + b))
	fmt.Printf("(a - b): %v\n", (a - b))
	fmt.Printf("(a * b): %v\n", (a * b))
	fmt.Printf("(a / b): %v\n", (a / b))
	fmt.Printf("(a %% b): %v\n", (a % b))

	a++
	fmt.Printf("a: %v\n", a)
	b--
	fmt.Printf("b: %v\n", b)
}

2. 关系运算符

在这里插入图片描述

package main

import "fmt"

func main() {
	a := 1
	b := 2

	fmt.Printf("(a > b): %v\n", (a > b))
	fmt.Printf("(a < b): %v\n", (a < b))
	fmt.Printf("(a >= b): %v\n", (a >= b))
	fmt.Printf("(a <= b): %v\n", (a <= b))
	fmt.Printf("(a == b): %v\n", (a == b))
	fmt.Printf("(a != b): %v\n", (a != b))
}

3. 逻辑运算符

在这里插入图片描述

package main

import "fmt"

func main() {
	a := true
	b := false

	fmt.Printf("(a && b): %v\n", (a && b))
	fmt.Printf("(a || b): %v\n", (a || b))
	fmt.Printf("(!a): %v\n", (!a))
	fmt.Printf("(!b): %v\n", (!b))
}

4. 位运算符

在这里插入图片描述

package main

import "fmt"

func main() {
	a := 4 // 二进制 100
	fmt.Printf("a: %b\n", a)
	b := 8 // 二进制 1000
	fmt.Printf("b: %b\n", b)

	fmt.Printf("(a & b): %v, %b \n", (a & b), (a & b))
	fmt.Printf("(a | b): %v, %b\n", (a | b), (a | b))
	fmt.Printf("(a ^ b): %v, %b\n", (a ^ b), (a ^ b))
	fmt.Printf("(a << 2): %v, %b\n", (a << 2), (a << 2))
	fmt.Printf("(b >> 2): %v, %b\n", (b >> 2), (b >> 2))
}

5. 赋值运算符

在这里插入图片描述

package main

import "fmt"

func main() {
	var a int
	a = 100
	fmt.Printf("a: %v\n", a)
	a += 1 // a = a + 1
	fmt.Printf("a: %v\n", a)
	a -= 1 // a = a -1
	fmt.Printf("a: %v\n", a)
	a *= 2 // a = a * 2
	fmt.Printf("a: %v\n", a)
	a /= 2 // a = a / 2
	fmt.Printf("a: %v\n", a)
}

十. golang流程控制

1. if 语句

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
}

(1). 不需使用括号将条件包含起来
(2). 大括号{}必须存在,即使只有一行语句
(3). 左括号必须在if或else的同一行
(4). 在if之后,条件语句之前,可以添加变量初始化语句,使用;进行分隔
(5). 不能使用0或非0表示真假

func test3() {
	if age := 20; age > 18 {
		fmt.Println("你是成年人")
	}
	fmt.Printf("程序运行结束")
}

func main() {
	// test1()
	// test2()
	test3()
}
func test4() {
	var i = 1
	if i { // 编译失败
		fmt.Println("here")
	}
	fmt.Printf("程序运行结束")
}

2. if else 语句

if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
} else {
  /* 在布尔表达式为 false 时执行 */
}
func f2() {
	var s int
	fmt.Println("输入一个数字:")
	fmt.Scan(&s)

	if s%2 == 0 {
		fmt.Print("s 是偶数\n")
	} else {
		fmt.Print("s 不是偶数\n")
	}
	fmt.Print("s 的值是:", s)
}

3. if else if 语句

if 布尔表达式1 {
    // do something
} else if 布尔表达式2 {
    // do something else
}else {
    // catch-all or default
}
func f5() {
	if score := 80; score >= 60 && score <= 70 {
		fmt.Println("C")
	} else if score > 70 && score <= 90 {
		fmt.Println("B")
	} else {
		fmt.Println("A")
	}
}

4. 嵌套 if 语句

if 布尔表达式 1 {
   /* 在布尔表达式 1 为 true 时执行 */
   if 布尔表达式 2 {
      /* 在布尔表达式 2 为 true 时执行 */
   }
}
func f2() {
	// 判断男女生及年龄
	gender := "女生"
	age := 16
	if gender == "男生" {
		fmt.Println("男生")
		if age > 18 {
			fmt.Println("成年")
		} else {
			fmt.Println("未成年")
		}
	} else {
		fmt.Println("女生")
		if age > 18 {
			fmt.Println("成年")
		} else {
			fmt.Println("未成年")
		}
	}
}

4. switch语句

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
func f() {
	grade := "A"
	switch grade {
	case "A":
		fmt.Println("优秀")
	case "B":
		fmt.Println("良好")
	default:
		fmt.Println("一般")
	}
}

多条件匹配

func f() {
	day := 3
	switch day {
	case 1, 2, 3, 4, 5:
		fmt.Println("工作日")
	case 6, 7:
		fmt.Println("休息日")
	}
}

case 可以是条件表达式

func f() {
	score := 90
	switch {
	case score >= 90:
		fmt.Println("享受假期")
	case score < 90 && score >= 80:
		fmt.Println("好好学习吧!")
	default:
		fmt.Println("玩命学习!")
	}
}

fallthrough 强制执行后面的一个 case 代码
fallthrough 不能用在switch的最后一个分支

switch {
    case false:
        fmt.Println("The integer was <= 4")
        fallthrough
    case true:
        fmt.Println("The integer was <= 5")
        fallthrough
    case false:
        fmt.Println("The integer was <= 6")
        fallthrough
    case true:
        fmt.Println("The integer was <= 7")
        fallthrough
    case false:
        fmt.Println("The integer was <= 8")
    default:
        fmt.Println("default case")
}

5. for 循环语句

go语言中的 for 循环,只有 for 关键字,去除了像其他语言中的 while 和 do while

for 初始语句;条件表达式;结束语句{
    循环体语句
}
func f() {
	for i := 1; i <= 10; i++ {
		fmt.Printf("i: %v\n", i)
	}
}

func f() {
	i := 1
	for ; i <= 10; i++ {
		fmt.Printf("i: %v\n", i)
	}
}

func f() {
	i := 1 // 初始条件
	for i <= 10 {
		fmt.Printf("i: %v\n", i)
		i++ // 结束条件
	}
}

for循环可以通过 break goto return panic 语句强制退出循环。

6. for range 循环语句

Go语言中可以使用 for range 遍历数组、切片、字符串、map 及通道(channel)。通过for range遍历的返回值有以下规律

1.数组、切片、字符串返回索引和值。
2.map返回建和值。
3.通道(channel)只返回通道内的值。

// 循环数组
func f() {
	var a = [5]int{1, 2, 3, 4, 5}
	for i, v := range a {
		fmt.Printf("i: %d, v: %v\n", i, v)
	}
}

func main() {
	f()
}

// 循环字符串
func f() {
	var s = "多课网,go教程"
	for i, v := range s {
		fmt.Printf("i: %d, v: %c\n", i, v)
	}
	// %c 按照字符输出
}

func main() {
	f()
}

// 循环切片
func f() {
	var s = []int{1, 2, 3, 4, 5}
	for i, v := range s {
		fmt.Printf("i, %d, v: %v\n", i, v)
	}
}

func main() {
	f()
}

// 循环 map
func f() {
	m := make(map[string]string)
	m["name"] = "tom"
	m["age"] = "20"
	m["email"] = "tom@gmail.com"
	for k, v := range m {
		fmt.Printf("k: %v, v: %v\n", k, v)
	}
}

func main() {
	f()
}

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

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

相关文章

内容算法解读:提高内容摘要与原文的一致性(Faithfulness)

全文摘要&#xff1a;受益于预训练语言模型的发展&#xff0c;应用神经网络模型提取内容摘要的技术也获得了长足进步。但目前还存在一个未被很好解决的问题&#xff1a;神经网络模型提取的摘要不能如实反映原文档的中心思想&#xff0c;没有做到忠实&#xff08;not faithful&a…

simulink PID控制

系列文章目录 文章目录系列文章目录前言一、非线性系统线性化原理二、反馈控制开环控制反馈or闭环控制PID ControllerPID微调案例总结前言 将非线性系统近似线性化PIDblock与微调 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、非线性系统线性化 …

Day907.分区表 -MySQL实战

分区表 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于分区表的内容。 经常被问到这样一个问题&#xff1a; 分区表有什么问题&#xff0c;为什么公司规范不让使用分区表呢&#xff1f; 一、分区表是什么&#xff1f; 为了说明分区表的组织形式&#xff0c;先创建…

Python 数据库如何更新、删除、执行?这里实例告诉你

人生苦短 我用Python 这次继续给大家带来数据库的相关操作 Python 安装包其他数据:点击此处跳转文末名片获取 数据库更新操作 更新操作用于更新数据表的的数据&#xff0c; 以下实例将 EMPLOYEE 表中的 SEX 字段为 M的 AGE 字段递增 1&#xff1a; #!/usr/bin/python # -*- …

ubuntu-9-安装chrony时间同步

使用chrony搭建时间同步服务器 [Linux系列]Chrony时间同步服务器 配置chrony服务&#xff0c;实现服务器时间自动同步 linux上内网环境配置NTP时间同步详解 经验体会&#xff1a;解决Ubuntu 18.04Windows双系统时间不同步的问题 1 时间同步 我们知道一台电脑主机&#xff0c;…

将微信小程序页面转为图片

最近做项目遇到一个需求,那就是要将某个页面转为图片然后传给后端,我仔细找了一圈,发现官方那个Api也就是wx.canvasToTempFilePath生成的图片很有可能为空,太坑了,于是我放弃用它了,选择了用wxml2canvas。 安装wxml2canvas npm init npm install wxml2canvas --save --…

通用游戏地图解决方案设计解析

前言&#xff1a; 在软件开发过程中&#xff0c;我们都希望能设计出一个稳健的&#xff0c;可维护的系统&#xff0c;为了实现这个目的&#xff0c;人们总结出了很多相关的设计原则&#xff0c;比如SOLID原则&#xff0c; KISS原则等等。SOLID每个字母代表了一种设计原则&…

数据是如何在计算机中存储的

我们普通人对于数据存储的认识恐怕大多数都是从自己使用的电脑来的。现在几乎人手一台电脑,而我们的电脑存储着各种各样的文件,比如视频文件、音频文件和Word文档等。这些文件从计算机术语的角度都可以称为数据。 如图1-1所示是Windows 10 “我的电脑”的截图。通过该截图我…

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多

202302读书笔记|《长安的荔枝》——只要肯努力&#xff0c;办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊&#xff0c;读起来一气呵成&#xff0c;以讲故事的口吻叙述&#xff0c;上林署九品小官员——李善德&#xff0c;兢兢业业工作多年&#xff0c;终于借贷买了房&…

mac M1 nvm安装教程,避坑

mac M1 nvm 安装问题 新款的mac搭载了苹果自研的芯片&#xff0c;放弃了intel的x86芯片&#xff0c;那之前的软件难免会存在兼容性问题。 鄙人有幸踩了第一个坑。 在通过nvm 安装不同版本的node 时&#xff0c;出现了问题。 问题一&#xff1a;先说一下 nvm的安装问题&#…

Python02 基础语法

Python02 基础语法 二、基础语法 2.1 注释 概念&#xff1a;对某一部分代码的解释说明&#xff0c;在程序执行的时候不会去进行执行。比如&#xff1a;产品的说明书、电影的旁白。 程序员最讨厌的两件事&#xff1a; 一件是自己写代码被要求加注释 另一件是接手别人代码&…

Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等

最近收到私信问我在cesium上展示的一些三维数据是如何生产和处理的,这篇文章就给大家一次性讲个透彻。 首先我们来做做分类。市面上能接触到的,常见的,cesium上支持展示的三维数据大致分为以下几种: 1.倾斜摄影(osgb,obj) 2.点云数据(las,pts) 3.手工模型(gltf,…

win10安装oracle

文件放到最后。我的电脑是win11的&#xff0c;因为老师让写下安装笔记&#xff0c;在11上安装的时候没有截屏&#xff0c;所以在虚拟机上重新安装下吧。室友说要把文件夹放到c盘才能打开。我试了下&#xff0c;具体的是要把Oracle11g文件夹放到c盘根目录下。如果解压后不是这个…

修正一些formdesigner的一些bug与操作

之前集成了formdesigner表单设计器&#xff0c;但还是有些问题&#xff0c;所以进行一些bug修复与功能修正 一、之前组件布局的图标不见了 在main.js里增加下面一行 import /components/formdesigner/assets/iconfont/iconfont.js 效果如下&#xff1a; 二、选择列表没有数…

react-draggable实现拖拽详解

react-draggable属性常用属性属性列表事件列表举例首先安装 react-draggable实现移动希望小编写的能够帮助到你&#x1f618;属性 常用属性 属性默认值介绍axisxhandle拖动的方向&#xff0c;可选值 x ,y,bothhandle无指定拖动handle的classposition无handle的位置&#xff0…

习题30 if elif else 语句

people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件&#xff0c;print("We should not take the…

MyBatis框架的入门案例

MyBatis框架的入门案例 资源地址&#xff1a;https://download.csdn.net/download/weixin_41957626/87531373 1.MyBatis的配置 环境&#xff1a;基于maven的结构 1.1目录结构 1.2依赖包 <dependencies><!--mybatis--><dependency><groupId>org.mybatis…

【Vue3 第二十二章】过渡动画

一、基本用法 <Transition> 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-…

函数栈帧的创建和销毁(详解)

函数栈帧的创建和销毁&#x1f996;函数栈帧是什么&#xff1f;&#x1f996;函数栈帧的创建和销毁解析&#x1f40b;栈是什么&#xff1f;&#x1f40b;认识相关寄存器和汇编指令&#x1f40b;解析函数栈帧的创建和销毁&#x1f433;预备知识&#x1f433;函数的调用堆栈&…

SpringBoot入门 - 配置热部署devtools工具

在SpringBoot开发调试中&#xff0c;如果我每行代码的修改都需要重启启动再调试&#xff0c;可能比较费时间&#xff1b;SpringBoot团队针对此问题提供了spring-boot-devtools&#xff08;简称devtools&#xff09;插件&#xff0c;它试图提升开发调试的效率。准备知识点什么是…