106【GoLand-基础2】(三)

简介: 106【GoLand-基础2】
  1. 结构体的定义

go语言没有面向对象的概念,结构体的定义与类型定义类似,只不过多了一个struct关键字。

1. 结构体的定义
type 结构体类型名称 struct{
  成员定义;
  成员定义;
  成员定义;
}
-----------------测试
package main
import "fmt"
type Student struct {
  name    string
  age     int
  sex     int
  teacher string
}
func main() {
  var s1 Student 
  s1.name = "李明"
  s1.age = 20
  s1.sex = 0
  s1.teacher = "王先生"
  fmt.Printf("%T\n", s1)
  fmt.Printf("%v\n", s1)
}
-----------------测试
2.匿名结构体定义:
var 结构体名字 struct{
  xxxx
  xxxx
}
-----------------测试
package main
import "fmt"
func main() {
  var Student struct {
    name    string
    age     int
    sex     int
    teacher string
  }
  Student.age = 20
  Student.name = "jsxs"
  Student.sex = 1
  Student.teacher = "丽丽"
  fmt.Printf("%v\n", Student)
}
-----------------测试
  1. 结构体的初始化
1.第一种: 以键值对的方式进行初始化
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  var jsxs Person //类型定义
  //  1.第一种定义方式 -> 使用键值对
  jsxs = Person{ //进行初始化
    id:    1,
    name:  "heh",
    age:   0,
    email: "22123121", //最后一个也要添加逗号
  }
2.第二种:按照顺序的方式进行初始化。顺序一定要保持一致
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  var jsxs Person 
  jsxs = Person{1, "dsds", 0, "dssdsd"}
3.第三种:利用语法糖方式
jsxs:=Person{
  xx:xx
}
  1. 结构体指针

结构体指针和普通的变量指针相同.

1.普通方法创建结构体指针
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 *Person // 定义一个结构体指针
  p1 = &jsxs     //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1)
2. new创建结构体指针  new(结构体名字)
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 = new(Person)  ///---》利用new
  //var p1 *Person // 定义一个结构体指针
  p1 = &jsxs //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1) 
3.结构体指针的访问-》  指针变量名.属性/ (*指针变量名).属性
  type Person struct {
    id    int
    name  string
    age   int
    email string
  }
  jsxs := Person{1, "dsds", 0, "dssdsd"}
  var p1 = new(Person)
  //var p1 *Person // 定义一个结构体指针
  p1 = &jsxs //指针指向地址
  fmt.Printf("%v\n", jsxs)
  fmt.Printf("%v\n", *p1)
  fmt.Printf("%v", p1.id)  //与下面的结果一致
  fmt.Printf("%v", (*p1).id) //与上面的结果一致 (*)可以省略 

4.结构体作为函数参数

go结构体可以像普通变量一样,作为函数的参数,这里分为两种情况

  1. 直接传递结构体,这是一个副本(拷贝),在函数内部不会改变外面结构体内容
  2. 传递结构体指针,这时在函数内部,能够改变外部结构体内容
1. 值传递: 形参改变实参不变
package main
import "fmt"
type Person struct {
  id    int
  name  string
  age   int
  email string
}
func test(p1 Person) {
  p1.id = 1
  p1.name = "sdsds"
  p1.age = 20
  p1.email = "sdsd"
  fmt.Printf("%v\t", p1)
}
func main() {
  person := Person{2, "SDDF", 0, "GFDG"}
  test(person) //值传递
  fmt.Printf("%v\t", person)
}
--------------
2.指针传递: 形参改变实参也改变
package main
import "fmt"
type Person struct {
  id    int
  name  string
  age   int
  email string
}
func test(p1 *Person) { //指针接受
  p1.id = 1
  p1.name = "sdsds"
  p1.age = 20
  p1.email = "sdsd"
  fmt.Printf("%v\t", p1)
}
func main() {
  person := Person{2, "SDDF", 0, "GFDG"}
  p1 := new(Person) // 创建一个指针
  p1 = &person
  test(p1) //传递一个地址
  fmt.Printf("%v\t", *p1)
}
  1. 结构体的嵌套
package main
import "fmt"
type Person struct {
  name string
  age  int
  pie  Pie  //人类拥有宠物
}
type Pie struct {
  name string  //姓名
  sort string  //种类
}
func main() {
  p := Person{
    name: "jsxs",
    age:  20,
    pie: Pie{ //初始化结构体
      name: "小黄",
      sort: "金毛",
    },
  }
  fmt.Printf("%v", p)
}
(10).方法 ✔™✅

Go语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法概念。我们也可以声明一些方法,属于某一个结构体。

Go语言方法的语法

Go中的方法是一种特殊的函数,定义struct之上(与struct关联,绑定),被称为struct的接收者(receive)通俗的讲: "方法就是有接收者的函数"

  1. 方法的定义
1.方法的定义 -> 一个方法和一个函数非常相似,多了一个接受类型
type 结构体名 struct{}
func (接受该方法的结构体 结构体名) 方法名称(参数列表) 返回值类型 {}
func (接受该方法的结构体 *结构体名) 方法名称(参数列表) 返回值类型 {}
***********************************************************
值传递 
package main
import "fmt"
type Person struct { // 1.定义一个结构体
  name string
}
func (per Person) eat() { //2. 给结构体Person添加一个eat()的方法
  fmt.Printf("%v,eat....", per.name)
}
func (per Person) sleep() { //3. 给结构体Person添加一个sleep()的方法
  fmt.Printf("%v,sleep....", per.name)
}
func (per Person) sum(a, b int) int {
  return a + b
}
func main() {
  person := Person{ // 4.初始化结构体
    name: "李明",
  }
  person.eat() // 5.结构体本身调用自己的属性
  person.sleep()
  println(person.sum(1, 2))
}
***********************************************************
  1. 方法接收者类型

结构体实列,有值类型指针类型,那么方法的接受者是结构体,那么有值类型和指针类型。区别就是接收者是否赋值结构体副本。值类型拷贝,指针类型不拷贝

指针传递
package main
import "fmt"
type Person struct { // 1.定义一个结构体
  name string
}
func (per *Person) test() {  //2.添加一个指针
  per.name = "sssss"
  fmt.Printf("%v", per.name)
}
func main() {
  person := Person{ // 4.初始化结构体
    name: "李明",
  }
  p := new(Person)
  p = &person
  fmt.Printf("%v", person)
  p.test()  // 通过指针进行调用
  fmt.Printf("%v", person)
  //println(person)
}
(11).接口类型

接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。Go语言的接口是一种新的类型定义,他把所有的具有共性的方法定义在一起任何具有其他类型只要实现了这些方法就是实现了这个接口

1.接口的初始化

1.定义接口
type interface_name interface{
  方法名 [返回值]
}
2. 定义结构体
 type struct_name struct{
  成员变量
}
3.实现接口的方法
func(结构体变量 结构体变量名) 方法名() [返回值类型]{
方法实现
}
4.声明接口有哪个结构体来实现

在接口中定义,若干个空方法。这些方法都具有通用性。

假如说一个结构体要实现一个接口,那么他要实现结构体的所有方法;否则会报错

package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法-》实现接口的方法
func (c Computer) read() {
  fmt.Printf("%v\n,read......", c.name)
}
// 给结构体添加一个方法-》实现接口的方法
func (c Computer) write() {
  fmt.Printf("%v\n,write......", c.name)
}
func main() {
  var usb USB  // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = computer  //声明这个接口将有computer这个结构体来实现
  usb.read() //接口调用
  usb.write()
}
  1. 接口值类型接收者和指针类型接收者

值接受就是一个拷贝,指针接受就是非拷贝

1.值传递
******************************************************
package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法
func (c Computer) read() {
  c.name = "sds"   // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,reading......\n", c.name)
}
// 给结构体添加一个方法
func (c Computer) write() {
  c.name = "sds"   // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,write......\n", c.name)
}
func main() {
  var usb USB // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = computer //声明这个接口将有computer这个结构体来实现
  usb.read()     //接口调用
  usb.write()
  fmt.Printf("%v", computer.name)
}
******************************************************
2.指针传递
******************************************************
package main
import "fmt"
// 定义一个接口存在两个方法
type USB interface {
  read()  //定义一个读的方法
  write() //定义一个写的方法
}
// 定义一个结构体
type Computer struct {
  name string
}
// 给结构体添加一个方法
func (c *Computer) read() {  // 指针传递 -----
  c.name = "sds" // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,reading......\n", c.name)
}
// 给结构体添加一个方法
func (c *Computer) write() {  // 指针传递 -----
  c.name = "sds" // 在里面惊进行修改 ------- 值操作
  fmt.Printf("%v,write......\n", c.name)
}
func main() {
  var usb USB // 定义一个接口变量
  computer := Computer{
    name: "HP",
  }
  usb = &computer //声明这个接口将有computer这个结构体来实现  ---指针传递
  usb.read()      //接口调用
  usb.write()
  fmt.Printf("%v", computer.name)
}
相关文章
|
缓存 Linux Windows
flyingsaucer进行html文件转图片和pdf
目录 一、前言 二、html转图片 1、添加依赖 2、代码示例 (1)测试html文件 (2)代码示例 3、演示结果 三、html转pdf 1、添加依赖 2、代码示例 3、演示结果 四、注意点 1、html转图片的源url 2、部署到linux上后中文乱码 五、Linux上安装字体 1、拷贝字体 2、赋予权限 3、建立字体缓存 4、查看安装的字体
flyingsaucer进行html文件转图片和pdf
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
【5月更文挑战第2天】在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
572 0
|
机器学习/深度学习 资源调度 算法
AI-逻辑回归模型
逻辑回归是一种用于分类问题的统计模型,尤其适合二分类任务,如预测广告点击率、判断邮件是否为垃圾邮件、评估疾病风险和预测信用卡违约等。模型通过线性方程(logit函数)结合Sigmoid函数将结果映射到0到1区间,表示概率。损失函数通常使用交叉熵,优化时常用梯度下降。评估指标包括ROC曲线和AUC,后者衡量模型整体性能,值越接近1表示性能越好。在不平衡数据集上,可使用`class_weight='balanced'`来调整样本权重。
哆啦A梦
哆啦A梦。
154 2
|
缓存 JSON JavaScript
使用资源栈组全球多地域创建VPC
通过ROS的资源栈组,您可以在一个阿里云账号下的全球多地域创建相同配置的VPC。
|
安全 编译器 C++
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)(二)
【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)
|
前端开发 JavaScript 开发者
Typecho-handsome主题美化
本篇文章主要介绍一下handsome主题的美化教程
623 0
Typecho-handsome主题美化
|
存储 Java Go
值类型和引用类型|学习笔记
快速学习值类型和引用类型。
153 0
值类型和引用类型|学习笔记
|
消息中间件 Kafka
物流项目中SparkSQL的相关调优
编写完成从Kafka消费数据,打印控制台上,其中创建SparkSession实例对象时,需要设置参数值。
207 0

热门文章

最新文章