【go語言學習筆記】結構體

1.結構體的定義

go語言中,結構體的聲明非常類似c語言,具體定義方法如下:

初始化方法有三種:

  • 順序初始化,每個變量都必須初始化
  • 部分成員初始化,未初始化的變量被賦值成0
  • 結構體指針變量初始化
package main

import "fmt"

// 定義一個結構體類型
type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	//1.順序初始化,每個變量都必須初始化
	var s1 Student = Student{1, "mike", 'm', 18, "北京"}
	fmt.Println("s1 = ", s1)

	//2.部分成員初始化,未初始化的變量被賦值爲0
	s2 := Student{name: "xiaoming", addr: "上海"}
	fmt.Println("s2 = ", s2)

	//3.結構體指針變量初始化
	var p1 *Student = &Student{name: "lihua", addr: "廣州"}
	fmt.Println("*p1 = ", *p1)
	//使用自動推導類型
	fmt.Printf("p1 type is %T\n", p1)
}

2.結構體的比較和賦值

這裏的比較和賦值類似數組的比較和賦值,只有同類型才能比較和賦值,比較只能使用==來比較相等或不相等。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	s1 := Student{1, "mike", 'm', 18, "bj"}
	s2 := Student{1, "mike", 'm', 18, "bj"}
	s3 := Student{2, "mike", 'm', 18, "bj"}
	fmt.Println("s1 == s2", s1 == s2)
	fmt.Println("s1 == s3", s1 == s3)

	// 同類型結構體變量可以相互賦值
	var tmp Student
	tmp = s3
	fmt.Println(tmp)
}

3.結構體成員的使用

這裏對結構體成員的使用類似c語言,使用.運算符操作。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	var s Student

	//操作成員需要使用(.)運算符
	s.id = 1
	s.name = "mike"
	s.age = 18
	s.addr = "北京"
	fmt.Println("s = ", s)
}

4.結構體指針的操作

這裏對結構體指針的操作並不是用->,而是繼續使用.操作符,也就是說,假設p1爲結構體指針,那麼,p1.name(*p1).name這兩種方式完全等價。

我們還可以使用new函數來定義一個結構體,new函數返回的是一個結構體指針。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	//1.指針有合法指向後,才能操作成員
	//先定義一個普通結構變量
	var s Student
	var p1 *Student
	p1 = &s

	//go語言中沒有->運算符,下面兩種寫法等價
	p1.id = 18
	(*p1).name = "mike"
	p1.addr = "北京"
	fmt.Println("p1 = ", p1)

	// 通過new申請一個結構體
	p2 := new(Student)
	p2.id = 1
	p2.name = "mike"
	p2.age = 18
	p2.sex = 'm'
	p2.addr = "北京"
	fmt.Println("p2 = ", p2)
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章