zoukankan      html  css  js  c++  java
  • Go基础及语法(四)

    结构体

    package main
    
    import "fmt"
    
    //定义结构体
    type person struct {
    	name string
    	age  int
    }
    
    func main() {
    	p1 := person{name: "a", age: 18} //初始化结构体
    	fmt.Println(p1) //{a 18}
    }
    
    

    匿名结构体

    package main
    
    import "fmt"
    
    func main() {
    	//匿名结构体
    	p2 := struct {
    		name string
    		age  int
    	}{name: "b", age: 20}
    	fmt.Println(p2.name, p2.age) //b 20
    }
    
    

    构造函数

    package main
    
    import "fmt"
    
    type person struct {
    	name string
    	age  int
    }
    
    //构造函数
    func newPerson(s string, i int) (p person) {
    	p = person{
    		name: s,
    		age:  i,
    	}
    	return p
    }
    
    func main() {
    	p3 := newPerson("c", 22) //初始化结构体
    	fmt.Println(p3)          //{c 22}
    }
    
    

    方法和接收者

    package main
    
    import "fmt"
    
    type person struct {
    	name string
    	age  int
    }
    
    func newPerson(s string, i int) (p person) {
    	p = person{
    		name: s,
    		age:  i,
    	}
    	return p
    }
    
    /*
    构造方法
    func (接收者 类型) 方法名(){
    	方法主体
    }
     */
    func (p person) method() {
    	fmt.Println("person's method") //person's method
    }
    
    func main() {
    	p4 := newPerson("d", 24) //初始化结构体
    	p4.method() //调用方法
    }
    
    

    结构体的值

    在Go语言中,函数之间参数的传递都是经过拷贝的,如果想在方法上修改结构体的值,需传入指针

    package main
    
    import "fmt"
    
    type person struct {
    	name string
    	age  int
    }
    
    func newPerson(s string, i int) (p person) {
    	p = person{
    		name: s,
    		age:  i,
    	}
    	return p
    }
    
    func (p person) method1() {
    	p.age++
    }
    
    //*接收传递参数的指针
    func (p *person) method2() {
    	p.age++
    }
    
    func main() {
    	p5 := newPerson("d", 24)
    	p5.method1()
    	fmt.Println(p5.age) //24
    	p5.method2()
    	fmt.Println(p5.age) //25
    }
    
    

    结构体的嵌套和匿名字段

    package main
    
    import "fmt"
    
    type person struct {
    	name string
    	age  int
    }
    
    type school struct {
    	class  string
    	person //结构体的匿名字段
    }
    
    func main() {
    	s := school{
    		class: "A",
    		person: person{
    			name: "a",
    			age:  18,
    		},
    	}
    	fmt.Println(s) //{A {a 18}}
    }
    
    

    JSON序列化与反序列化

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Person struct {
    	Name string
    	Age  int
    }
    
    type school2 struct {
    	Class  string
    	Person Person
    }
    
    func main() {
    	s := school2{
    		Class: "A",
    		Person: Person{
    			Name: "a",
    			Age:  18,
    		},
    	}
    	k, v := json.Marshal(s) //JSON序列化
    	if v != nil {
    		fmt.Println("JSON反有误")
    	}
    	fmt.Println(string(k)) //{"Class":"A","Person":{"Name":"a","Age":18}}
    }
    
    

    匿名结构体

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Person struct {
    	Name string
    	Age  int
    }
    
    type school struct {
    	Class  string
    	Person
    }
    
    func main() {
    	s := school{
    		Class: "A",
    		Person: Person{
    			Name: "a",
    			Age:  18,
    		},
    	}
    	k, v := json.Marshal(s) //序列化
    	if v != nil {
    		fmt.Println("JSON反有误")
    	}
    	fmt.Println(string(k)) //{"Class":"A","Name":"a","Age":18}
    	var s2 school
    	json.Unmarshal([]byte(string(k)), &s2) //反序列化
    	fmt.Println(s2) //{A {a 18}}
    }
    
    
    
  • 相关阅读:
    多线程
    Java命令行传参
    IO流
    集合
    Java基础语法
    常见的数据结构
    泛型
    java 集合重要概念 (Set 的存储内存解析)
    java 集合重要概念 (== 和 equals 解读)
    java 集合重要概念 (实现一个简单的斗地主)
  • 原文地址:https://www.cnblogs.com/bgr1115/p/14298447.html
Copyright © 2011-2022 走看看