## 一、定義

## 二、實例
#### 為類型添加方法
* 基礎類型作為接受者
~~~
package main
import "fmt"
type myint int
func Add(a,b myint) myint {
return a+b
}
func (a myint)Add2(b myint) myint {
return a+b
}
func main() {
var aa myint = 10
var bb myint = 10
// 面向過程調用
fmt.Println("Add(a+b)",Add(aa,bb))
//面向對象調用
fmt.Println("Add(a+b)",aa.Add2(bb))
}
~~~
* 結構體作為接收者
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
//給User添加方法
func (u User) userInfos(){
fmt.Println(u.Id,u.Name,u.Age)
}
func main() {
user := User{Id: 1,Name: "aaa",Age: 20}
user.userInfos()
}
~~~
## 三、值語義和引用語義
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
// 引用語義
func (u *User) func001(){
(*u).Id = 1
u.Name = "aaa" //這里的 u 會被轉化成 (*u)
u.Age = 18 //這里的 u 會被轉化成 (*u)
}
// 值語義
func (u User) func002(){
u.Id = 2
u.Name = "bbb"
u.Age = 20
}
func main() {
// 指針作為接收者的效果
u1 := User{1,"a1",180}
fmt.Println("函數調用前",u1)
(&u1).func001()
fmt.Println("函數調用后",u1)
// 值作為接收者
u2 := User{2,"b1",250}
fmt.Println("函數調用前",u2)
u2.func002()
fmt.Println("函數調用后",u2)
}
~~~
結果為:
函數調用前 {1 a1 180}
函數調用后 {1 aaa 18}
函數調用前 {2 b1 250}
函數調用后 {2 b1 250}
## 四、方法的繼承
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
// 為User 定義方法
func (u *User) func001(){
fmt.Printf("%d,%s,%d\n",u.Id,u.Name,u.Age)
}
//繼承上面的方法
type Addrs struct {
User
addr string
sex string
}
func main() {
u1 := User{1,"aaa",20}
u1.func001()
u2 := Addrs{User{2,"bbb",18},"sh","nan"}
u2.func001()
}
~~~
## 五、方法重寫
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
// 為User 定義方法
func (u *User) func001(){
fmt.Printf("我是被重寫的方法:%d,%s,%d\n",u.Id,u.Name,u.Age)
}
//繼承上面的方法
type Addrs struct {
User
addr string
sex string
}
//方法重寫
func (a *Addrs) func001(){
fmt.Printf("我是重寫:%d,%s,%d\n",a.Id,a.Name,a.Age)
}
func main() {
u1 := User{1,"aaa",20}
u1.func001()
u2 := Addrs{User{2,"bbb",18},"sh","nan"}
u2.func001()
// 顯式調用
u2.User.func001()
}
~~~
運行結果:
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
// 為User 定義方法
func (u *User) func001(){
fmt.Printf("我是被重寫的方法:%d,%s,%d\n",u.Id,u.Name,u.Age)
}
//繼承上面的方法
type Addrs struct {
User
addr string
sex string
}
//方法重寫
func (a *Addrs) func001(){
fmt.Printf("我是重寫:%d,%s,%d\n",a.Id,a.Name,a.Age)
}
func main() {
u1 := User{1,"aaa",20}
u1.func001()
u2 := Addrs{User{2,"bbb",18},"sh","nan"}
u2.func001()
// 顯式調用
u2.User.func001()
}
~~~
## 六、方法值和方法表達式
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
// 為User 定義方法
func (u *User) func001(){
// %p是地址 %v是值
fmt.Printf("%p,%v\n",u,u)
}
func main() {
u1 := User{1,"aaa",20}
u1.func001()
// go語義方法值特性
fun1 := u1.func001
fun1()
// Go方法表達式特性
u2 := (*User).func001
u2(&u1)
}
~~~
## 七、創建get和set方法并進行調用
~~~
package main
import "fmt"
// 結構體
type User struct {
Id int
Name string
Age int
}
func (u *User) setname() {
u.Name = "aa"
}
func (u User) getname() string {
return u.Name
}
func (u User) bite() {
fmt.Printf("%s",u.Name)
}
func fun001(){
//創建對象
d := User{1,"二哈",2}
d.bite()
}
func main() {
fun001()
}
~~~
結果為:
二哈
- 一、數組
- 二、切片
- 三、copy
- 四、MAP
- 五、結構體
- 六、結構體參數
- 七、面向”對象“
- 1、匿名字段
- 2、方法
- 3、包和封裝
- 4、接口
- 5、異常處理
- 八、Json
- 九、文件操作
- 1、寫文件
- 2、讀取文件內容
- 3、拷貝文件
- 十、反射
- 1、查看類型,字段和方法
- 2、查看匿名字段
- 3、修改基本類型的值
- 4、修改結構體的值
- 5、調用方法
- 十一、并發編程
- 1、并行和并發
- 2、協程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定時器
- 8、select
- 9、協程同步鎖
- 十二、socket編程
- 十三、Http編程
- 十四、并發爬蟲和數據處理
- 1、簡易爬蟲實例
- 2、并發爬取圖片
- 3、讀文件中的數據
- 4、數據清洗
- 其他
- 1、推薦文章