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)
}
相关文章
|
6月前
|
Go
GoLand创建项目过程
GoLand创建项目过程
95 0
|
Cloud Native 测试技术 Go
你不知道的goland技巧
你不知道的goland技巧
100 0
|
关系型数据库 Go
106【GoLand-基础2】(四)
106【GoLand-基础2】
83 0
|
IDE Go 开发工具
Go开发IDE全览:GoLand vs VSCode全面解析
Go开发IDE全览:GoLand vs VSCode全面解析
509 0
|
IDE Go 开发工具
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
【Go·编辑器IDE】GoLand集成开发环境安装及使用教程
|
3月前
|
Rust Shell 开发者
7步开始rust(自定义环境安装与vscode开发环境配置)
本文档详细记录了当改变Rust安装路径至特定目录(如 `/home/local_rust`)时,如何在VSCode环境中正确配置Rust开发环境的过程。主要包括:设置环境变量、使用清华大学镜像安装Rust及更新镜像源、手动部署 `rust-analyzer`、安装标准库源码、安装与配置VSCode插件等七个步骤,确保开发者能够顺利搭建并使用定制化的Rust开发环境。
517 0
|
5月前
|
IDE Linux Go
|
6月前
|
Java Python
pycharm-ieda-phpstorm超级好用插件,一键解释代码
pycharm-ieda-phpstorm超级好用插件,一键解释代码
|
6月前
|
Python
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
【Python笔记】pip intall -e命令:让你的工程直接使用开源包的源码,可断点调试,修改源码!
218 0
|
6月前
|
Go 开发工具
编程笔记 GOLANG基础 004 GOLANG常用命令及VSCODE快捷键
编程笔记 GOLANG基础 004 GOLANG常用命令及VSCODE快捷键
111 2