当前位置:网站首页>go里面的基本知识
go里面的基本知识
2022-08-02 05:16:00 【笑 瘾】
一、函数
1、函数传参默认是传值
2、指针:在函数内对数据进行修改,能够对函数外产生影响
3、函数的定义:
func funcname(argslist type) [return_types]{
}
4、函数可以传入多个参数,多个返回值
5、可变长参数的函数定义:
func add4(nums ...int){
}
二、go的数据类型
1、变量定义
1、var a int = 1
2、a := 1
2、基本的数据类型
int
float
string
byte
bool
3、nil --》零值
4、指针类型:
1、存放内存地址
2、指针也是有类型的
3、var p *string
定义了一个string指针
p中存放一个字符串的地址
三、go与python的区别:
1、go与python在模块与包上的区别
go:⼀个⽂件夹可以作为 package,同⼀个 package 内部变量、类型、⽅法等定义可以相互看到。
python:必须导入模块里面的包,也就是py文件,才能使用那个模块里面的变量、方法
2、注意:一般文件中声明的package要与目录同名
3、如果导入的包有同名的情况,可以给他命别名–》import 别名 “导入路径”
四、模块与包
1、package–》目录:
⼀般来说,⼀个⽂件夹可以作为 package,同⼀个 package 内部变量、类型、⽅法等定义可以相互看到
1.同一个package中定义的内容是共享的(可见的),不同的包中相互使用通过import “xxx/xxx/包名”导入
2.如何指定是否为同一个包:
同一个目录下、指定的package相同;
3.如果导入的包有同名的情况,可以给它命别名-->import 别名 "导入路径"
2、modules–》包管理的模式:
Go 语⾔也有 Public 和 Private 的概念,粒度是包。如果类型/接⼝/⽅法/函数/字段的⾸字⺟⼤写,则是 Public的,对其他 package 可⻅,如果⾸字⺟⼩写,则是 Private 的,对其他 package 不可⻅
共有的--》Public:内容以大写字母开头
私有的--》Private:内容以小写字母开头
五、流程控制
1、选择结构:
1.1、if–》if/ if else
age := 18
if age < 18 {
fmt.Printf("Kid")
} else {
fmt.Println("Adult")
}
// 可以简写为:
if age := 18; age < 18 {
fmt.Println("Kid")
} else {
fmt.Println("Adult")
}
1.2、switch:用于基于不同条件执行不同动作。
同c,但是不需要break,匹配到某个 case,执行完该 case 定义的行为后,默认不会继续往下执行。
// 使用了`type` 关键字定义了一个新的类型 Gender
type Gender int8
// 使用 const 定义了 MALE 和 FEMALE 2 个常量
// Go 语言中没有枚举(enum)的概念,一般可以用常量的方式来模拟枚举。
const (
MALE Gender = 1
FEMALE Gender = 2
)
gender := MALE
switch gender {
case FEMALE:
fmt.Println("female")
case MALE:
fmt.Println("male")
default:
fmt.Println("unknown")
// male
}
如果需要继续往下执行,需要使用 fallthrough
switch gender {
case FEMALE:
fmt.Println("female")
fallthrough
case MALE:
fmt.Println("male")
fallthrough
default:
fmt.Println("unknown")
}
// 输出结果
// male
// unknown
2、循环结构
2.1、for循环:
格式:for 初始化数据;条件判断;自增/自减{xxxxx}
sum := 0
for i := 0; i < 10; i++ {
if sum > 50 {
break
}
sum += i
}
fmt.Println(sum)
// 注意这里的i是临时变量,用完回收了
2.2、死循环:for true{}和for{}是一个意思
package main
import "fmt"
func main() {
for true {
fmt.Println("这是无限循环。**\n**");
}
for {
fmt.Println("这是无限循环。**\n**");
}
}
2.3、for range{}:迭代数据
nums := []int{
10, 20, 30, 40}
for i, num := range nums {
fmt.Println(i, num)
}
// 0 10
// 1 20
// 2 30
// 3 40
m2 := map[string]string{
"Sam": "Male",
"Alice": "Female",
}
for key, value := range m2 {
fmt.Println(key, value)
}
// Sam Male
// Alice Female
六、go的结构体
1、结构体:由一系列具有相同类型或不同类型的数据构成的数据集合
。
2、结构体的组成
1.数据:各种变量
2.方法:函数
3、结构体定义
需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员
# 例如:定义结构体 Student,并为 Student 添加 name,age 字段
type Student struct {
name string
age int
}
4、方法定义
实现方法与实现函数的区别在于,func 和函数名hello 之间,加上该方法对应的实例名 stu 及其类型 *Student,可以通过实例名访问该实例的字段name和其他方法了
func (name Student)方法名(参数列表)返回值{
函数体
}
# 为结构体Student实现 hello() 方法
func (stu *Student) hello(person string) string {
return fmt.Sprintf("hello %s, I am %s", person, stu.name)
}
5、结构体的使用
5.1、实例化结构体语法格式如下:
variable_name := structure_variable_type {value1, value2...valuen}
指针结构体:
1、stu = &Student{
name = "cali",age=18}
2、stu = new(Student)
普通结构体
1、stu = Student{
name="cali",age=18}
5.2、案例:
//调用方法通过 实例名.方法名(参数) 的方式。
// 创建一个实例
stu := &Student{
name: "Tom",
}
// 调用实例方法
msg := stu.hello("Jack")
fmt.Println(msg) // hello Jack, I am Tom
// 使用New实例化
stu2 := new(Student)
stu2.name = "Cali"
fmt.Println(stu2.hello("Alice")) // hello Alice, I am , name 被赋予默认值""
6、结构体嵌套
type person struct{
Name string
Age int
Contact struct {
Phone, City string
Code int // 门牌号
}
}
func main() {
a := person{
Name:"Corwien", Age:15}
a.Contact.Phone = "10086"
a.Contact.City = "Guangzhou"
a.Contact.Code = 2007
fmt.Println(a)
}
//结果:
go run struct.go
{
Corwien 15 {
10086 Guangzhou 2007}}
7、结构体的组合
package main
import "fmt"
// 嵌入结构作为匿名字段
type human struct {
Sex int
}
type teacher struct {
human // Go会将嵌入字段默认作为属性名,所以在赋值时需要这样写:human: human{Sex: 1}
Name string
Age int
}
type student struct {
human
Name string
Age int
}
func main() {
a := teacher{
Name:"Corwien", Age:25, human: human{
Sex: 1}}
b := student{
Name:"mark", Age:12, human: human{
Sex: 1}}
a.Name = "Jack"
a.Age = 10
// a.human.Sex = 0
a.Sex = 0
fmt.Println(a, b)
}
//结果:
go run struct.go
{
{
0} Jack 10} {
{
1} mark 12}
边栏推荐
- Redis database
- Redis数据库
- 聪明人的游戏提高篇:第三章第二课:“桐桐数”(number)
- 国际顶会OSDI首度收录淘宝系统论文,端云协同智能获大会主旨演讲推荐
- How to perform concurrent calculation (stability test and stress test)?
- 点云旋转到参考坐标系方向(最小方向包围盒方法)
- 51 MCU peripherals: DS18B20
- 目标检测重要概念——IOU、感受野、空洞卷积、mAP
- Luogu mini game Daquan (everyone who uses Luogu must know)
- 21 Day Learning Challenge Schedule
猜你喜欢
nacos registry
软件测试的需求人才越来越多,为什么大家还是不太愿意走软件测试的道路?
How much does a test environment cost? Start with cost and efficiency
虚拟现实房产展示系统提前预见未来装修效果
51 MCU Peripherals: Infrared Communication
pytorch basic operations: classification tasks using neural networks
[C language] LeetCode26. Delete duplicates in an ordered array && LeetCode88. Merge two ordered arrays
程序员写PPT的小技巧
机器学习——支持向量机原理
leetcode每天5题-Day04
随机推荐
classSR论文阅读笔记
在腾讯做外包测试的那些日子.....
JUC(二)原子类:CAS、乐观锁、Unsafe和原子类
pytorch basic operations: classification tasks using neural networks
Three methods of importing sql files in MySQL
金山云团队分享 | 5000字读懂Presto如何与Alluxio搭配
Browser onload event
自动化运维工具——ansible、概述、安装、模块介绍
软件测试在职2年跳槽4次,你还在怪老板不给你涨薪?
Use the browser's local storage to realize the function of remembering the user name
There are more and more talents in software testing. Why are people still reluctant to take the road of software testing?
无代码生产新模式探索
C竞赛训练
5年在职经验之谈:2年功能测试、3年自动化测试,从入门到不可自拔...
CPU使用率和负载区别及分析
虚拟现实房产展示系统提前预见未来装修效果
51单片机外设篇:DS18B20
LeetCode brush topic series - 787 K station transfer within the cheapest flight
使用TinkerPop框架对GDB增删改查
程序员写PPT的小技巧