Golang基础1

news/2024/9/13 19:41:55 标签: golang, 开发语言, 后端

Golang 教程1

注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点

[go教程](‘Go基础 · Go语言中文文档 (topgoer.com)’)

一、基础

tip: 下划线_ 可以起到忽略的作用

运行以下命令来初始化一个新的 Go 模块:

// 如你的项目在 gocode/testproject01/unit2/demo01 中 (从src后开始, 用‘/’隔开)。
go mod init gocode/testproject01/unit2/demo01 
//1、go mod init:这是 Go 的模块初始化命令,用于创建一个新的 go.mod 文件,它是 Go 模块的元数据文件,用于记录模块的基本信息和依赖关系。
//2、gocode/testproject01/unit2/demo01:这是你指定的模块名称。这个名称将成为你的模块在 Go 生态系统中的唯一标识符。


//输入操作
_, err := fmt.Scanf("%v", &name) //录入数据的时候,类型一定要匹配。

// _:这是一个空白标识符,在 Go 语言中用来忽略赋给它的值。 
//1、 fmt.Scanln 函数返回两个值:第一个是扫描的元素数量,第二个是错误(如果有)。因为我们只关心错误(第二个返回值),所以我们使用 _ 来忽略第一个返回值。
//2、 err:这是用来存储 fmt.Scanln 函数返回的错误值。如果函数执行成功,则 err 将为 nil;如果发生错误,则 err 将包含具体的错误信息。
//3、 :=:这是一个短声明语法,用于声明并初始化一个变量。在这里,我们声明了一个名为 err 的变量,并将其初始化为 fmt.Scanln(&a) 函数的第二个返回值。
//4、 fmt.Scanln(&a):这是 fmt.Scanln 函数调用,它从标准输入读取数据,并尝试将读取的数据转换成变量 a 的类型(这里是整型 int)。它需要一个变量的引用作为参数,这里使用了 &a。

1、 自动缩进

gofmt -w xxx.go 
2、 关于赋值, 支持这种声明
sex := "man"
var n4, name, n5 = 10, "jack", 7.8
n6, height := 6.9, 100.6
3、全局赋值, 省时省力
var (
	n9 = 100
	n10 = "dasda"
)

//导入包也可以如此操作, 如
import (
    "fmt"
    "strconv"
)
4、字符串一旦定义好,值不可变
name = "黎明"
name[0] = "牛" //会报错
5、 如果字符串需要赋值特殊的字符(关键字、<、= …),用反单引号包裹
str := `
	var a string = 1
	string a < 1231
`
6、类型转换 T() 显示转化, T为你想要转换的类型
a := 100
b := float32(a)
fmt.Println(a, b)
//注意,类型大的转化至类型小的变量,高位部分会被截断

var n1 int64 =  888888888
var n2 = int8(n1)
fmt.Println(n2)
fmt.Printf("%T", n2c)

``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01> go run .\main.go
56
int8
``````````````````````````````````````````````````````````````````````````````````````````````````

var n3 int32 = 12 
//会报错, var n4 int64 = int64(n3) + 30
var n4 int8 = n3 + 30 
fmt.Println(n3)
fmt.Println(n4)

``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01> go run .\main.go
# command-line-arguments
.\main.go:5:16: cannot use n3 + 30 (value of type int32) as int8 value in variable declaration
``````````````````````````````````````````````````````````````````````````````````````````````````
7、 string类型转化,strconv.parseInt等函数返回的是2个值(value, err)所以应有2个变量承接
func main() {
	str := "123"
	i, err := strconv.Atoi(str)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(i)
	} 
}

``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go
123
``````````````````````````````````````````````````````````````````````````````````````````````````
8、 指针
func main() {
	var a int = 10
	var ptr *int = &a
	fmt.Println("Value of a is ", a)
	fmt.Println("Value of a is ", *ptr)
	fmt.Println("Address of a is ", ptr)
	fmt.Println("Address of a is ", &a)
	fmt.Println("Address of a is ", &ptr)
	*ptr = 20
	fmt.Println("Value of a is ", a)
} 

``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01>  go run .\main.go  
Value of a is  10
Value of a is  10
Address of a is  0xc00000a0f8
Address of a is  0xc00000a0f8
Address of a is  0xc000078050
Value of a is  20
`````````````````````````````````````````````````````````````````````````````````````````````````
9、分支控制
//单、多分支, 注意:条件表达式可以不写,也建议不写
if 条件表达式 {
   逻辑代码
} else if 条件表达式 {
   逻辑代码
} else {
   逻辑代码 
}

// switch 不用额外加break 防止代码穿透
switch 条件表达式 {
    case 条件满足1:
    	xxx
    case 条件满足2:
    	xxx
    。。。
    default:
    	XXX
}

// 如:
func main() {
	var a int 
	fmt.Println("请输入数字:")
	_, err := fmt.Scanln(&a)
	if err != nil {
		fmt.Println("输入错误:", err)
		return
	}
	if a == 1 {
		fmt.Println("a = 1")
	} else if a == 2 {
		fmt.Println("a = 2")
	} else {
		fmt.Println("a = 3")
	}

} 

//可以使用 fallthrough 穿透,但只能穿透一层
10、 循环 (go里面没有while循环)
//跟c语言一样,条件表达式不用()包裹
func main() {
	i, sum := 0, 0 
	for i = 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
} 
``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01> go  run .\main.go
45
``````````````````````````````````````````````````````````````````````````````````````````````````
//可以跟while一样, 格式灵活
func main() {
	for {
		fmt.Println("hello Golang")
	}
} 
``````````````````````````````````````````````````````````````````````````````````````````````````
(base) PS E:\Goproject\src\gocode\testproject01\unit2\demo01> go  run .\main.go
hello Golang
hello Golang
hello Golang
hello Golang
hello Golang
。。。
``````````````````````````````````````````````````````````````````````````````````````````````````

10.1 for range (Go 特有,可以遍历数组、切片、字符串、map以及通道,形式上有点类似于foreach)
func main() {
	str := "hello world"
	for i := 0; i < len(str); i++ {
		fmt.Printf("%c", str[i])
	}
} 

//等效于
// 这里的 fmt.Printf("索引为 %d, 对应的值为 %c \n", i, val) 是带格式的输出, 可以类比 fmt.Println()
func main() {
	str := "hello world"
	for i, val  := range str {
		fmt.Printf("索引为 %d, 对应的值为 %c \n", i, val)
	}
} 


http://www.niftyadmin.cn/n/5621986.html

相关文章

DeepKE-LLM框架介绍及简单使用

简介 DeepKE 作为一个全面的知识提取工具包&#xff0c;不仅在构建知识图谱方面展现出卓越性能&#xff0c;还针对多种场景&#xff08;如cnSchema、低资源环境、文档级处理和多模态分析&#xff09;提供了强大支持。它能高效提取实体、关系和属性&#xff0c;并为初学者提供了…

工业物联网(IIOT)的定义、示例及关键技术

“工业物联网”一词在工业背景下普遍存在&#xff0c;因为数字化转型已成为许多组织的业务优先事项。那么&#xff0c;什么是IIoT&#xff1f; 工业4.0 随着互联网云计算和互联网的其他进步&#xff0c;我们现在正处于下一次工业革命的中间&#xff0c;挖掘并将数据转化为信息。…

uniapp h5手机如何打开本地跑的前端项目进行本地调试

本地调试使用 vConsole是一个轻量级的移动端调试工具&#xff0c;可以在iOS设备上直接调试Uniapp H5应用。下面是具体的步骤&#xff1a; 在Uniapp项目中安装vConsole依赖&#xff1a;npm install vconsole。 在项目的main.js文件中引入vConsole库&#xff1a;import VConso…

Mysql语句性能优化

SQL查询过程 查询缓存&#xff1a; 执行查询语句的时候&#xff0c;会先查询缓存&#xff08;MySQL 8.0 版本后移除&#xff0c;因为这个功能不太实用&#xff09;。分析器&#xff1a; 没有命中缓存的话&#xff0c;SQL 语句就会经过分析器&#xff0c;分析器说白了就是要先看…

vue获取一个时间段的时间差和时间差格式

<template><div><div><p>开始时间&#xff1a;{{ state.stm }}</p><p>结束时间&#xff1a;{{ state.etm }}</p><p>相差&#xff08;数字格式&#xff09;&#xff1a;{{state.ztime.timeList.join(:)}}</p><p>相…

百日筑基第六十二天-持续集成和持续交付的 pipeline 概念

百日筑基第六十一天-持续集成和持续交付的 pipeline 概念 在软件开发中&#xff0c;Pipeline 是一种自动化的过程&#xff0c;它包括从开发人员提交代码&#xff0c;到代码构建&#xff0c;测试&#xff0c;部署等一系列的步骤。在持续集成&#xff08;Continuous Integration…

pve(‌Proxmox Virtual Environment)-OpenVPN设置自定义IP

文章目录 前言一、新增nas用户二、修改服务端OpenVPN配置1. ssh连接nas2. 修改openvpn.conf3. 新增每个客户端的配置文件4. 服务端OpenVPN重启 三、客户端重启四、其他问题总结 前言 我的OpenVPN服务端在群晖NAS上&#xff0c;我的pve机器连接nas组成局域网。但是每次服务端重…

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit&#xff0c;子组件可以将事件通知父组件&#xff0c;父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式&#xff0c;允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…