L'éditeur PHP Baicao vous présentera aujourd'hui une technologie très pratique : l'analyse yaml et le marshal en golang, et comment traiter les URL. Le Golang étant largement utilisé dans le développement back-end, la compréhension et la maîtrise de ces technologies amélioreront considérablement notre efficacité de développement. Cet article présentera brièvement les concepts de base et l'utilisation de yaml, et démontrera à travers des exemples comment utiliser golang pour analyser et marshaler yaml en même temps, nous discuterons également de la façon de traiter les URL, y compris l'analyse des paramètres d'URL, la construction d'URL, etc. . J'espère qu'en étudiant cet article, je pourrai vous aider à mieux appliquer ces technologies dans des projets réels.
J'essaie d'utiliser un fichier de configuration qui a un champ URL et je souhaite marshaler et démarshaler ce type. La documentation indique que je peux exécuter une fonction de marshalling personnalisée.
Dans ce terrain de jeu Golang, vous pouvez voir que la fonction de démarchage personnalisé fonctionne bien, mais pas la fonction de maréchal personnalisé :
type YAMLURL struct { *url.URL } func (j *YAMLURL) UnmarshalYAML(unmarshal func(interface{}) error) error { fmt.Println("custom unmarshal function") var s string err := unmarshal(&s) if err != nil { return err } url, err := url.Parse(s) j.URL = url return err } func (j *YAMLURL) MarshalYAML() (interface{}, error) { fmt.Println("custome marshal") return j.String(), nil }
https://go.dev/play/p/24jbjehi1q8
Je ne sais pas pourquoi Merci
Le problème est que vous avez écrit l'attribut marshalyaml
方法,因此您可以在指针类型上调用此方法,同时您在 configuration
结构上定义了 uri
的 a
pour le récepteur du pointeur, en tant que non-pointeur (en fonction du lien du terrain de jeu que vous avez collé).
Par conséquent, vous devez vous convertir uri
属性类型更改为 *yamlurl
(而不是 yamlurl
):
type a struct { uri *yamlurl `yaml:"url"` }
Ou définissez marshalyaml
comme un récepteur sans pointeur (alias récepteur de valeur) comme ceci :
func (j YAMLURL) MarshalYAML() (interface{}, error) { fmt.Println("custome marshal") return j.String(), nil }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!