2022年6月16日 星期四

Go 的 String()

Go 本身可以用 String() 來做到和 Java 等語言的 toString() 一樣的功效。可我最近在使用 String() 發現一個奇特的陷阱

一般來說, struct 要追加 func 的話,都會寫成

type A struct{}
func (a *A) DoSomething(){}

所以直覺上來說, String() 應該也是如此。但事實上有沒有指針有很大差別


事前備註一下:這邊使用的是 go 1.18 ,不確定後續版本會如何



package main

import "fmt"

type User struct {
	ID   int
	Name string
}

func main() {
	fmt.Println(User{1, "Lily Taylor"})
	fmt.Println(&User{2, "Poppy Roberts"})
}

func (u *User) String() string {
	return fmt.Sprintf("User[ID: %03d; Name: %s]", u.ID, u.Name)
}

輸出結果為(struct 本身沒有執行 String()):

{1 Lily Taylor}
User[ID: 002; Name: Poppy Roberts]
package main

import "fmt"

type User struct {
	ID   int
	Name string
}

func main() {
	fmt.Println(User{1, "Lily Taylor"})
	fmt.Println(&User{2, "Poppy Roberts"})
}

func (u User) String() string {
	return fmt.Sprintf("User[ID: %03d; Name: %s]", u.ID, u.Name)
}

輸出結果卻是我要的:

User[ID: 001; Name: Lily Taylor]
User[ID: 002; Name: Poppy Roberts]

沒有留言:

張貼留言