go基本语法

跟Java比较学习。

hello word

示例代码

test1.go文件:
// 包路径
package main// 导入模块,下面两种都行
import ("fmt"
)
import "log"//  main方法
func main() {log.Print("hello word !!!")fmt.Print("hello word 222")
}

运行命令

go run .\test1.go

打包二进制

> go build .\test1.go

./test1.exe

变量可见性

首字母大写就是public

首字母小写就是private

{不能单独一行

在Java和C中都可以,go中就不行

正确的应该这样:

行结束不需要分号;

加上后IDE会自动给删除

如果你就是要将两行代码放在一行,则需要在结尾加上;分号,但IDEA会在保存的时候自动给你拆分为两行。

字符串

字符串连接+

格式化

// 格式化String.format
value := fmt.Sprintf("%s - %s", ">>", "<<")
// 打印到console上
fmt.Print(value)// 合并:格式化并打印出
fmt.Printf("%s - %s\n", ">>", "<<")

变量

变量申明和赋值

// 只声明一个变量i
var i int
// 给i变量赋值2
i = 2
// 创建变量并赋值3
ii := 3
// 声明常量
const pi float64 = 3.14var bo bool = false
bo1 := false
var f1 float32 = 1.1
var f2 = 1.2
f3 := 1.3

普通变量类型

uint8 unsiged int 8位

int8 有符号8位int

int16,int32,int64 类似,没有long

float32、float64 容易理解,没有double

这两个不清楚:

complex64 32 位实数和虚数

complex128 64 位实数和虚数

不一样的:

uintptr 无符号整型,用于存放一个指针

rune 类似 int32

byte 类似 uint8  0到255

变量作用域

全局变量和局部变量可以名称一致,但使用时会优先使用局部变量。

数组

一维数组

var strs = [3]string{"111", "222", "333"}
// 初始化数组中 {} 中的元素个数不能大于 [] 中的数字。 多出就会报错
var strs = [3]string{"111", "222", "333","444"}
// 只初始化了前两个元素
var strs = [3]string{"111", "222"}
// 数组长度根据后边初始化数据的个数来确定为2
var strs = [...]string{"111", "222"}
// 初始化指定元素下表元素的数据
var strs = [...]string{1: "111", 4: "222"}
// 数组的长度
var length int = len(strs)
fmt.Println("数组长度:", length)
for i := 0; i < length; i++ {// 访问和给数组赋值fmt.Println(len(strs[i]))strs[i] = "ab"
}

二维数组 

// 定义二位数组,并初始化
var rows = [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9},
}
fmt.Println(rows)// 二位数组一行一行添加
// [3][3]int{} 错误,行列取悦于append了多少次
var rows1 = [][]int{}
var row1 = []int{1, 2, 3}
var row2 = []int{4, 5, 6}
// 各行可以一样,也可不一样长
var row3 = []int{7, 8, 9, 10}
rows1 = append(rows1, row1)
rows1 = append(rows1, row2)
rows1 = append(rows1, row3)
fmt.Println(rows1)
fmt.Println("row count:", len(rows1))
fmt.Println("col count:", len(row1))
fmt.Println("row1 :", rows[0])
fmt.Println("row2 :", rows[1])
// 不允许访问列 rows[][1]   syntax error: unexpected ], expected operand
// fmt.Println("col1 :", rows[][1])
fmt.Println("cell[1][1] :", rows[1][1])// 遍历二维数组
for i := 0; i < len(rows1); i++ {for j := 0; j < len(rows1[i]); j++ {fmt.Println("cell[", i, "][", j, "] : ", rows1[i][j])}
}

方法参数传数组和传指针

// 包路径
package mainimport "fmt"//  main方法
func main() {// 定义二位数组,并初始化var rows = [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9},}fmt.Println(rows)addRow(rows)fmt.Println(rows)// 传递二维数组的指针 &rowsaddRow1(&rows)fmt.Println(rows)// 调用固定元素数组参数,必须是固定元素个数数组// 数量不一致直接报错row1 := [5]int{1, 2, 3, 4, 5}printRow(row1)// 将二维数组的第一行当做一维数组也不行// printRow(rows[0])
}// 数组是值类型,这么传实际传的是值而非引用
func addRow(rows [][]int) {row := []int{11, 22}rows = append(rows, row)
}// 接受一个二位数组的指针,就是地址
func addRow1(rows *[][]int) {row := []int{11, 22}*rows = append(*rows, row)
}//  必须这么调用:row1 := [5]int{1, 2, 3, 4, 5};    printRow(row1)
func printRow(row [5]int) {fmt.Println(row)
}

指针数组

// 定义指向数组的指针数组
ptr := []*int{&rows[0], &rows[1], &rows[2]}

指向指针的指针

var pptr **int
已经很熟悉了,不用再说了。

 结构体

基本语法

// 包路径
package mainimport "fmt"// Book 全局可以使用
type Book struct {title stringauth  string
}//  main方法
func main() {// 定义结构体,只能在方法里边用/*type Book struct {title stringauth  string}*/var book1 Bookbook1 = Book{"title1", "auth2"}book1 = Book{title: "title2"}// book2 获取book1的值,最后那个也添加了个逗号,恶心不book2 := Book{title: book1.title,auth:  book1.auth,}book1.auth = "1000"// 传值:不会修改值setAuth200(book2)// 传地址:会修改值setAuth200Point(&book2)var book3 Book// 没有book3 == nil 和 book3 == null这么一说// 是空对象相当于java中:book3 = new Book(); 不给里边赋值,所以直接访问不报错fmt.Println(book3)book3.auth = "2000"
}// 真NM耐造,book为null 不会报错
func setAuth200(book Book) {book.auth = "2000"
}func setAuth200Point(bookPtr *Book) {(*bookPtr).auth = "2000"
}

 继承和匿名字段

type Person struct {name stringsex  stringage  int
}func (p *Person) say() {fmt.Println("person fun11")
}type Student struct {// 将Person中的属性继承过来 s1.sexPerson// 创建person属性 s1.person.sexperson Personid     intaddr   string// 如果出现重名情况age int// 匿名字段string
}// 继承和匿名字段
func main() {fmt.Println("main ...")s1 := Student{Person{"5lmh", "man", 20}, Person{"5lmh", "man", 20}, 1, "bj", 20, "匿名字段"}fmt.Println(s1)// 获取person属性的sex值fmt.Println(s1.person.sex)// 获取继承过来的person属性sexfmt.Println(s1.sex)fmt.Println(s1.Person.sex)// 如果父子类中的属性重复// 给父类Person中赋值s1.Person.age = 100// 给子类属性age赋值s1.age = 200fmt.Println(s1)// 继承还可以继承方法s1.say()fmt.Println("success ...")
}

切片Slice

类似java的ArrayList 

var arr = []int{1, 2, 3, 4, 5}
fmt.Println(arr)// 切片类似:数组的 substring,前后是包含关系
sp := arr[0:]
fmt.Println(sp)
fmt.Println(len(sp))
fmt.Println(cap(sp))// 使用mark创建
var number = make([]int, 3, 5)
fmt.Println(number, len(number), cap(number))
// 在3个元素后边添加
number = append(number, 5)
// out: [0 0 0 5] 4 5
fmt.Println(number, len(number), cap(number))
number = append(number, 6)
number = append(number, 7)
number = append(number, 8)
// 长度超过容量后会自动扩容,二倍扩容
number = append(number, 9)
number = append(number, 10)
//out:[0 0 0 5 6 7 8 9 10] 9 10
fmt.Println(number, len(number), cap(number))var number1 = make([]int, len(number)*2, cap(number)*2)
copy(number1, number)
// out:[0 0 0 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0] 18 20
// len内的数据会默认给0
fmt.Println(number1, len(number1), cap(number1))// 将里边的数据全部清理为0
clear(number1)
// out:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 18 20
fmt.Println(number1, len(number1), cap(number1))

语言范围Rang

 rang 类似 java中的 迭代器 foreach

数组

// 遍历数组,index是下标
intArr := []int{1, 2, 3, 4, 5}
for index := range intArr {fmt.Print(index, "=", intArr[index], " ")
}
fmt.Println("")
// 可以直接将value遍历出来
for index, value := range intArr {fmt.Print(index, "=", value, " ")
}
fmt.Println("")
// 如果不需要index则可以用_替代,否则由会给你报错,这个变量没用
for _, value := range intArr {fmt.Print(value, " ")
}

 Map

// map的遍历
fmt.Println("")
map1 := make(map[int]string, 3)
fmt.Println(map1)
map1[10] = "aa"
map1[11] = "bb"
fmt.Println(map1)
// 遍历map,当前key和value如果不用,可以用_替代
for key, value := range map1 {fmt.Println(key, ":", value)
}
// 如果只有一个同样,遍历的是key,类似数组的index
for key := range map1 {fmt.Println(key)
}

切片 

fmt.Println("")
// 切片也可以类似
spArr := make([]int, 2, 50)
copy(spArr, intArr[3:])
// out:[4 5]
fmt.Println(spArr)
for index := range spArr {fmt.Print(index, "=", intArr[index], " ")
}

channel 

// channel 看样子类似java中的MQ,但不用那么复杂的实现机制
// chan int : 首先这个是一个通道channel, 然后是一个装int的channel
// 类似:LinkedQuery<Integer>
ch := make(chan int, 10)
ch <- 11
ch <- 12
ch <- 1000for val := range ch {fmt.Print(val, " ")// 一边遍历,一边可以添加数据,比ArrayList的强多了// 但这么搞就死循环了,逻辑上注意// ch <- 1000
}
// 最后需要关闭
close(ch)

Map集合 

// 创建 <int,string> 初始容量为2
mapCap := 2
map1 := make(map[int]string, mapCap)
fmt.Println(map1)// 添加元素,可相同会覆盖
map1[11] = "bb"
fmt.Println(map1)
map1[11] = "bbb"
map1[22] = "ccc"
map1[33] = "ddd"
fmt.Println(map1)// 根据Key删除元素
fmt.Println(len(map1))
delete(map1, 22)
fmt.Println(map1)
fmt.Println(len(map1))// 获取元素,如果没有则为空
fmt.Println("key:", 11, ",value:", map1[11])
fmt.Println("key:", 66, ",value:", map1[66])
// 如果有值则 value就是值,hasBollen为true,如果没有值 hasBollen = false
value, hasBollen := map1[66]
if hasBollen {fmt.Println("数据存在,value:", value)
} else {fmt.Println("数据不存在,key:", 66)
}// 遍历map
fmt.Println(map1)
for key, value := range map1 {fmt.Println("key:", key, ",value:", value)
}

方法

匿名方法 

func(i int, wg *sync.WaitGroup)为形参
(i, &wg) 为实际参数
var wg sync.WaitGroup
for i := 0; i < 10; i++ {wg.Add(1)go func(i int, wg *sync.WaitGroup) {fmt.Println(i)time.Sleep(20 * time.Microsecond)wg.Done()}(i, &wg)
}
wg.Wait()

接口Interface

不同点:

1. struct 实现 interface,并没有明显的实现写法,各写各的

2. struct 可以实现部分interface的方法,而不必要全部实现。直接用没问题,用interface进行引用就报错:

 

// 包路径
package mainimport "fmt"// 接口有两个方法
type Animal interface {call()getName() string
}// 创建类Market,有一个name熟悉
type Market struct {name string
}/**实现方法:1. (m Market): 标识 这个是Market类的方法2. call() 接口的方法
*/
func (m Market) call() {fmt.Println("market call,", "name:", m.name)
}func (m Market) getName() string {return m.name
}type Tiger struct {name string
}func (t Tiger) call() {fmt.Println("tiger call,", "name:", t.name)
}func (t Tiger) getName() string {return t.name
}func animalCall(a Animal) {a.call()
}// 空接口,可以接受任何类型的对象,并根据类型判断
func print(v interface{}) {switch t := v.(type) {case int:fmt.Println("integer", t)case string:fmt.Println("string", t)}
}//  main方法
func main() {// 接口 interfacem1 := Market{name: "m111"}fmt.Println(m1.getName())m1.call()m2 := new(Market)m2.name = "m222"m2.call()t1 := Tiger{name: "t1111"}fmt.Println(t1.getName())t1.call()// 根据传值的不同animalCall(m1)animalCall(t1)// 定义一个接口,然后复制类对象,按照接口调用就可以var a1 Animala1 = m1a1.call()// 将m1转换为 Market类型m11 := a1.(Market)fmt.Println(m11.name)// 空接口接受人任何对象print(11)print("str11")}

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

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

相关文章

《零基础学会!如何用 sql+Python 绘制柱状图和折线图,数据可视化一看就懂》

在数据驱动的时代&#xff0c;MySQL 是最常用的关系型数据库管理系统之一&#xff0c;广泛应用于各类数据存储和处理场景。数据分析的过程不仅仅是收集数据&#xff0c;还包括数据的清洗、转换、查询以及最终的报告和可视化。在本文中&#xff0c;我们将通过实际案例来介绍如何…

【博资考2】网安学院-北航网安基础部分(简洁版)

【博资考2】网安学院-北航网安基础部分 写在最前面北航网安学院考纲&#xff08;二&#xff09;知识要点&#xff08;三&#xff09;快速梳理1. **单钥密码体制**2. **双钥密码体制**3. **消息认证与杂凑函数**4. **数字签名**5. **密码协议**6. **数字证书与公钥基础设施 (PKI…

【Transformer模型学习】第二篇:多头注意力机制

文章目录 0. 前言1. 注意力机制&#xff08;Attention&#xff09;概述2. Q、K、V矩阵是怎么来的&#xff1f;3. 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;4. 多头注意力&#xff08;Multi-Head Attention&#xff09;5. 多头注意力的好处6. 总结 0…

网络运维学习笔记(DeepSeek优化版)002网工初级(HCIA-Datacom与CCNA-EI)子网划分与协议解析

文章目录 子网划分与协议解析1. VLSM与CIDR技术解析1.1 VLSM&#xff08;Variable Length Subnetwork Mask&#xff0c;可变长子网掩码&#xff09;1.2 CIDR&#xff08;Classless Inter-Domain Routing&#xff0c;无类域间路由&#xff09; 2. 子网划分方法与计算2.1 常规划分…

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹&#xff0c;用于放置调试文件以及你未来写的代码&#xff0c;随便命名但…

在线疫苗预约小程序(论文源码调试讲解)

第4章 系统设计 用户对着浏览器操作&#xff0c;肯定会出现某些不可预料的问题&#xff0c;但是不代表着系统对于用户在浏览器上的操作不进行处理&#xff0c;所以说&#xff0c;要提前考虑可能会出现的问题。 4.1 系统设计思想 系统设计&#xff0c;肯定要把设计的思想进行统…

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式&#xff0c;包括如何设置Redis主从节点&#xff0c;应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后&#xff0c;进而想要了解 Redis 集群如何使用&#xff0c;如何正确使用&#xf…

LangChain大模型应用开发:基于RAG实现文档问答

介绍 大家好&#xff0c;博主又来给大家分享知识了。随着大模型应用的不断发展&#xff0c;很多开发者都在探索如何更好地利用相关工具进行开发。那么这次给大家分享的内容是使用LangChain进行大模型应用开发中的基于RAG实现文档问答的功能。 好了&#xff0c;我们直接进入正…

零样本学习 zero-shot

1 是什么 2 如何利用零样本学习进行跨模态迁移&#xff1f; demo代码 安装clip pip install ftfy regex tqdm pip install githttps://github.com/openai/CLIP.git import torch import clip from PIL import Image# 加载 CLIP 模型 device "cuda" if torch.cuda.i…

防火墙双机热备---VRRP,VGMP,HRP(超详细)

双机热备技术-----VRRP&#xff0c;VGMP&#xff0c;HRP三个组成 注&#xff1a;与路由器VRRP有所不同&#xff0c;路由器是通过控制开销值控制数据包流通方向 防火墙双机热备&#xff1a; 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道&#xff08;心…

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…

Unity自定义树(Tree)

一、创建自定义树 右键——3D Object——Tree 树的大致形态&#xff1a; 二、主干树的整体设置 Distribution Tree Seed&#xff1a;树种子&#xff0c;调节此参数就可获得不同形态的树桩 Area Spread&#xff1a;区域的大小 Ground Offset&#xff1a;树距离初始地面的偏移…

Debezium日常分享系列之:Debezium 3.1.0.Alpha2发布

Debezium日常分享系列之&#xff1a;Debezium 3.1.0.Alpha2发布 模式历史配置默认值的变更可能的 Vitess 数据丢失Oracle 的 ReselectColumnsPostProcessor 行为变更Reselect 列后处理器的错误处理模式TinyGo WASM 数据类型改进Debezium 平台转换 UI 中的谓词支持Debezium 平台…

STM32MP157A-FSMP1A单片机移植Linux系统I2C总线驱动

由于I2C总线驱动为Linux内核自带的总线驱动&#xff0c;在一个新的板子上可能由于不同的定义与芯片原厂定义的I2C管脚有所不同&#xff0c;这时就需要开发人员对设备树信息及内核驱动进行更新。 原理图可知&#xff0c;I2C的SCL对应PF14&#xff0c;SDA对应PF15 在Linux内核中…

My first Android application

界面元素组成&#xff1a; 功能代码&#xff1a; /*实现功能&#xff1a;当输入内容后&#xff0c;欢迎文本发生相应改变&#xff0c;并清除掉文本域内容当未输入任何内容时&#xff0c;弹出提示文本以警告用户*/val greetingText findViewById<TextView>(R.id.printer)…

深度学习基础--ResNet网络的讲解,ResNet50的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;这篇文章是本人学习ResNet的学习笔记&#xff0c;并且用pytorch复现了ResNet50&…

【DeepSeek】【GPT-Academic】:DeepSeek集成到GPT-Academic(官方+第三方)

目录 1 官方deepseek 1.1 拉取学术GPT项目 1.2 安装依赖 1.3 修改配置文件中的DEEPSEEK_API_KEY 2 第三方API 2.1 修改DEEPSEEK_API_KEY 2.2 修改CUSTOM_API_KEY_PATTERM 2.3 地址重定向 2.4 修改模型参数 2.5 成功调用 2.6 尝试添加一个deepseek-r1参数 3 使用千帆…

用Golang与WebAssembly构建高性能Web应用:详解`syscall/js`包

用Golang与WebAssembly构建高性能Web应用&#xff1a;详解syscall/js包 引言为什么选择syscall/js包&#xff1f;适用场景 syscall/js包概述syscall/js包的核心概念1. js.Global2. js.Value3. js.Func4. js.Null 和 js.Undefined syscall/js包在WebAssembly中的位置 环境配置与…