go里面的基本知识

一、函数

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)
    	引用:Tst(stu)
普通结构体
	1、stu = Student{name="cali",age=18}
		引用:Tst(&stu)

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}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值