Go语言基础之基本语法

基本结构

package mainimport "fmt"func main() {fmt.Println("Hello,World!")
}
package mainimport ("fmt""log""net/http"
)func handler(w http.ResponseWriter,r *http.Request)  {s := "你好,世界!"fmt.Fprintf(w,"%s",s)log.Printf("%s",s)
}
func main() {fmt.Println("server start.")http.HandleFunc("/",handler)if err := http.ListenAndServe("localhost:1234",nil); err != nil {log.Fatal("ListenAndServe:",err)}
}
  • Go语言是编译型语言,将这几行代码保存在hello.go文件中,然后在文件当前目录下,命令行执行go run hello.go即可执行该,在命令行会输出Hello,World!,然而实际处理流程仍会先将其编译为二进制机器指令,然后链接相关资源再运行,最后输出结果
  • 实际上可以将编译和执行分为两步,先使用命令go build指令进行编译,然后找到编译生成的二进制文件直接执行该文件即可

实际执行结果如下所示

PS D:\book\ch01\1.1\helloworld> go run hello.go
Hello,World!
PS D:\book\ch01\1.1\helloworld> go build hello.go
PS D:\book\ch01\1.1\helloworld> ls目录: D:\book\ch01\1.1\helloworldMode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2022/12/27     17:08        2108024 hello
-a----       2022/12/28     16:44        1937408 hello.exe
-a----       2022/12/27     17:08             80 hello.goPS D:\book\ch01\1.1\helloworld> .\hello.exe
Hello,World!
PS D:\book\ch01\1.1\helloworld>

第二段代码的执行

PS D:\book\ch01\1.1\helloserver> go run .\main.go
server start.
2022/12/28 17:16:55 你好,世界!
2022/12/28 17:16:55 你好,世界!

同时打开浏览器,访问地址localhost:1234,也会显示你好,世界!

结构解析

package main:包的声明,也是没个项目的入口,main包是独立的可执行程序,包是Go语言项目结构的核心组成部分,如果其他Go程序要导入已有的程序,要通过import将对应的包引入;每一个Go语言程序的第一行都是包的声明,每个包可以有一个或者多个以.go为扩展名的文件

import:导入了Go语言提供的基础包fmt,Go语言提供了大量的标准包,此外用户自己开发的包也可以通过这种方式导入,在import关键字后使用小括号可以写入用到的多个包;这里需要注意的是与其他语言不同的,使用import导入的包必须在本程序中用到,如果导入了但没有用到,编译是无法通过的,同样的声明的变量也必须用到,否则也无法编译通过

func:是定义函数和方法的关键字,func关键后跟函数名,小括号内是参数列表,函数体用大括号括起来

fmt.Println("Hello,World!"):使用fmt的Println函数打印一个字符串,函数名的第一个字母大写表示包外可见,此外语句后面不需要加分号,只有当把多行代码写在一行的时候才会使用分号隔离,但这是非常差的写法,与Java不同与Python类似,但又不同于Python,Go语言在编译的时候会把换行符解析为分号,因此在实际写代码的时候注意换行即可,且函数体的大括号({)如果单独放在一行编译也是无法通过的

在第二段代码中,使用Go语言构建了一个Web服务,Go语言构建Web服务非常简单,直接使用标准的net/http包即可

代码中定义了函数handler,其参数是固定的,因为要满足接口的要求,其中第二个参数前面带个*号,表示此处参数的传递是传指针,http.Request代表一次请求,是一个结构体

:=表示声明和赋值另个动作一并完成,如果仅仅是声明而不赋值,则需要使用关键字var来声明,并且:=必须是未声明的变量,如果声明过则无法使用此方法来赋值

http.HandleFunc("/",handler)讲路径和处理函数绑定,表明请求该路径的时候,交给绑定的函数进行处理

if err := http.ListenAndServe("localhost:1234",nil); err != nil {log.Fatal("ListenAndServe:",err)}

该段代码用于启动Web服务,并监听相应端口

变量&常量&指针&赋值

变量

Go语言的变量声明使用var关键字,常量声明使用const关键字,语法如下:

var name[类型]=[表达式]

在使用过程中,类型和表达式两者可省略其一,但不能同时省略,如果省略类型,Go会根据表达式推测得出类型,如果省略了表达式,Go会为变量赋予一个默认值
数字类型默认值为0,布尔类型默认值为false,字符串类型默认值为“”,其他诸如接口、slice、指针、通道、函数的默认值为nil;如果是复合类型,例如结构体、其内部所有元素被赋予对应的默认值

package mainimport ("fmt""math/rand"
)func main() {//多个变量一起通过类型声明var i, j, k intfmt.Printf("i:%d,j:%d,k:%d", i, j, k)fmt.Println()//多个变量一起通过表达式声明var a, b, c = 1, "s", truefmt.Printf("a:%d,b:%s,c:%t", a, b, c)fmt.Println()//声明赋值的缩写f := rand.Float64() * 100fmt.Printf("f:%g", f)fmt.Println()m, n := 2, 1fmt.Println(m, n)
}

执行结果

PS D:\book\ch01\1.2\var> go run .\main.go
i:0,j:0,k:0
a:1,b:s,c:true
f:60.466028797961954
2 1

常量

Go语言定义常量使用的是const关键字,Go语言中的常量一般会用作全局常量,常量的值在程序编译的时候就确定了,之后不可再变

定义单个常量
const LENGTH=100
const s1 = "test"
const s2 string = "test"

同样的没有指明类型的声明,Go会根据等号右侧表达式的值推测出其类型,需要指出的是,这种用法成为无类型用法,无类型也是一种类型,它是一种比基本类型精度更高的类型,至少可达256位,比机器硬件精度更高,无类型在Go语言中有六种,无类型布尔、无类型整数、无类型文字符号、无类型浮点数、无类型复数和无类型字符串,无类型可以用来处理基本类型处理不了的数据,例如精度特别大的浮点数

定义多个常量
const(SYS="Debian"TYPE="pro"
)
常量生成器

声明常量可以使用常量生成器iota,它可以通过枚举创建一系列相关的值,而且不需要明确定义类型,iota每次从0开始取值,逐次加1

package mainimport "fmt"type data intconst (Zero data = iotaOneTwoThreeFour
)const (p2_0 = 1 << iotap2_1p2_2p2_3
)func main() {fmt.Println(Zero)fmt.Println(One)fmt.Println(Two)fmt.Println(Three)fmt.Println(Four)fmt.Println(p2_0)fmt.Println(p2_1)fmt.Println(p2_2)fmt.Println(p2_3)
}

执行结果

PS D:\book\ch01\1.2\iota> go run .\main.go
0
1
2
3
4
1
2
4
8

指针

假设有一个int型变量x,&x表示取x的地址,将此值赋给p,那么p就是指针,取得指针指向的值,使用*p

var int x //x默认初始值为0
p:=&x //p为整形指针,指向x
fmt.Println(*p) //此时打印输出0
*p=1 //类似于x=1
fmt.Println(x) //此时打印输出1

Go官方文档中提到的Zero Value,在很多场景下被称为“零值”,在C语言中称为默认初始值

可以使用指针来代替变量名,如果指针改变了变量值,会影响到变量名,本质上他们就是同一个内存空间,实际上复合类型也可以通过指针进行操作,复合类型内的具体元素同样有地址,并且可以通过指针进行操作,对于上边代码中的p我们称为指针类型,其默认值是nil,可以用过p==nil来判断是否取得地址,nil表示未成功取得

package main
import "fmt"
func main(){m:=1selfPlusPointer(&m)fmt.Println(m) //2// selfPlus返回得是指针类型,所以要加上*号才能取到指针指向的变量值,否则只是个地址fmt.Println(*selfPlus(1)) //2
}
// 定义了一个自增函数,接受的参数是一个int指针,函数体通过指针执行了自增,且函数没有返回值,因为通过指针直接修改了变量值
func selfPlusPointer(n *int){*n++
}
// 该函数接收一个整型参数,用一个临时变量暂时存储n的自增1的结果,然后再返回临时变量的指针类型
func selfPlus(n int) *int{t:=n+1return &t
}

在Go语言中除非显示的使用指针,否则所有的值传递都是具体值得赋值,包括符合结构

Go语言还提供了new函数,用于创建一个不需要名称的变量,并可以直接赋值给一个指针

p:=new(int) //p为*int类型
fmt.Println(*p) //0

赋值

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

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

相关文章

Dockerfile基础

前言 知识点整理 Dockerfile 简介 它是一个没有后缀名的文本文档&#xff0c;里面是组合镜像的一些命令&#xff0c;Docker build命令构建镜像时&#xff0c;通过读取Dockerfile中的指令的顺序&#xff08;自上到下&#xff09;自动生成镜像。 Dockerfile 命令 1. FROM 指…

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6

前言 我个人项目中&#xff0c;不想使用太重的数据库&#xff0c;而内嵌数据库中SQLite又是最受欢迎的&#xff0c; 因此决定采用这个数据库。 可是JPA并不支持Sqlite&#xff0c;这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异&#xff0c; 但是…

Android消息机制(Handler、Looper、MessageQueue)

一、ThreadLocal 1、什么是ThreadLocal ThreadLocal 是一个线程内部的数据存储类&#xff0c;通过它可以在指定的线程中存储数据&#xff0c;数据存储以后&#xff0c;只有在指定线程中可以获取到存储的数据&#xff0c;对于其他线程来说则无法获取到数据。 一般来说&#xf…

竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

说一说HTTP1.0、1.1、2.0版本区别和优化

说一说HTTP1.0、1.1、2.0版本区别和优化 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于传输超文本的应用层协议。 在不同的版本中&#xff0c;HTTP经历了一系列的演进和改进&#xff0c;主要包括HTTP 1.0、HTTP 1.1和HTTP 2.0。 下面详细解释它们之间…

亚马逊第二个大语言模型 Olympus 即将上线

据外媒爆料&#xff0c;亚马逊正在训练他的第二个大语言模型——Olympus&#xff0c;很有可能在今年12月份上线。亚马逊计划将Olympus接入在线零售商店、Echo等设备上的Alexa语音助手&#xff0c;并为AWS平台提供新的功能。据说这个大语言模型规模达到2万亿&#xff08;2000B&a…

C++ 删除无头链上所有指定值为x的节点。

C 删除无头链上所有指定值为x的节点。 #include<stdio.h> #include<ctype.h> #include<stdlib.h> typedef struct app {int data;struct app* next; }APP; int main() {int n;int node;int x;while (scanf("%d", &n) ! EOF){APP* head NULL, …

读《Segment Anything in Defect Detection》

摘要 (好像只是说把SAM应用到了红外缺陷分割领域) 引言 无损检测得到红外图像&#xff0c;根据热能观察异常 贡献&#xff1a; •从两个光学脉冲热成像系统构建广泛的缺陷热数据库&#xff0c;包括各种材料并释放它们。 • 开发DefectSAM&#xff0c;这是第一个用于缺陷检测…

maven升级版本后报错:Blocked mirror for repositories

出现问题的场景&#xff1a; 当 Maven 升级到3.8.1 之后&#xff0c;执行maven就会出现如下报错信息&#xff1a; maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories 原因&#xff1a; maven在3.8.1 的默认配置文件中增加了一组标签&#xff0…

MAC地址注册的网络安全影响和措施分析

MAC地址注册对网络安全具有重要影响&#xff0c;同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析&#xff1a; 影响&#xff1a; 1. 身份验证&#xff1a;MAC地址注册可用于设备的身份验证&#xff0c;但MAC地址本身并不…

033-从零搭建微服务-日志插件(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

【C/PTA】数组进阶练习(一)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 矩阵运算7-2 方阵循环右移7-3 螺旋方阵7-4 数组-杨辉三角7-5 数组-对角线求和7-6 数组-矩阵最小值 7-1 矩阵运算 给定一个nn的方阵&am…

大一,小小练习题--含答案

测试题 1.(1). 对于int类型的变量&#xff0c;Java编译器和大多数C编译器都是分配4个字节的内存&#xff0c;4个字节有32个二进制位即总共可以拥有多少种状态&#xff0c;其中一半的状态用来存储负数&#xff0c;一半的状态用来存储0和正数。因此&#xff0c;int类型的变量可以…

不标年份的葡萄酒质量好吗?

我们在葡萄酒标上经常看到生产年份&#xff0c;也就是指全部葡萄采摘的年份。旧世界葡萄酒产国认为葡萄酒年份对他们的影响较大&#xff0c;而新世界葡萄酒&#xff0c;年份的意义就稍微小些。甚至有一部分葡萄酒酒标上没有年份。在酒标上没有标注年份的葡萄酒&#xff0c;被称…

WSL2安装ubuntu及修改安装位置,设置Ubuntu开机启动链接ssh服务

1. WSL2安装ubuntu及修改安装位置 2. 设置Ubuntu开机启动链接ssh服务

学习无人机代码框架【第一天】---VMware 安装Ubuntu16.04时显示不全的解决方法

ros环境配置篇 环境配置在vmware上安装ubantu16.04操作系统安装完成后显示界面太小解决办法其他遇到的一些ubantu问题最后一步是在ubantu16上安装ros-kinetic其他很重要的一个工具是安装vmware-tool&#xff0c;可以支持把外部的文件或文字传入到虚拟机中管理不同的终端的软件代…

[C/C++] 数据结构 LeetCode:用队列实现栈

题目描述: 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元…

基于Springboot+Vue家电维修预约系统

需求&#xff1a; 登录后用户选择所在地区 1.日常事务工作人员预约&#xff08;进行分类筛选 如清洁、烹饪等&#xff0c;至少6个&#xff09;每天晚上22:00前预约 第二天起可上门 需要有时段的选择。 2.家电维修预约&#xff08;分类筛选 如&#xff1a;冰箱、空调、网络、电饭…

为什么 Intent 不能传递大数据

Intent 传递不同大小数据时的问题&#xff1a; 传 512k 以下的数据是可以正常传递的&#xff1b;传 512k&#xff5e;1024k 的数据会出错&#xff0c;闪退&#xff1b;传 1024k 以上的数据会报错&#xff1a;TransactionTooLargeException&#xff1b;考虑到 Intent 还包括要启…

kubernetes集群编排——etcd

备份 从镜像中拷贝etcdctl二进制命令 [rootk8s1 ~]# docker run -it --rm reg.westos.org/k8s/etcd:3.5.6-0 sh 输入ctrlpq快捷键&#xff0c;把容器打入后台 获取容器id [rootk8s1 ~]# docker ps 从容器拷贝命令到本机 docker container cp c7e28b381f07:/usr/local/bin/etcdc…