blob: ad5cf38e829ee646e083c6616421346a9e82d061 [file]
<!doctype html><html lang=en-US dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-1.2.0 docs-doc-page docs-doc-id-guide/go/codegen" data-has-hydrated=false><head><meta charset=UTF-8><meta name=generator content="Docusaurus v3.10.1"><title data-rh=true>Code Generation | Apache Fory™</title><meta data-rh=true name=viewport content="width=device-width, initial-scale=1.0"/><meta data-rh=true property=og:url content=https://fory.apache.org/docs/1.2.0/guide/go/codegen /><meta data-rh=true property=og:locale content=en_US /><meta data-rh=true property=og:locale:alternate content=zh_CN /><meta data-rh=true name=docusaurus_locale content=en-US /><meta data-rh=true name=docsearch:language content=en-US /><meta data-rh=true http-equiv=Content-Security-Policy content="frame-src 'self' https://ghbtns.com/;"/><meta data-rh=true property=og:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true property=og:image:width content=1500 /><meta data-rh=true property=og:image:height content=1500 /><meta data-rh=true name=twitter:card content=summary_large_image /><meta data-rh=true name=twitter:image content=https://fory.apache.org/img/logo.png /><meta data-rh=true name=docusaurus_version content=1.2.0 /><meta data-rh=true name=docusaurus_tag content=docs-default-1.2.0 /><meta data-rh=true name=docsearch:version content=1.2.0 /><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-1.2.0 /><meta data-rh=true property=og:title content="Code Generation | Apache Fory™"/><meta data-rh=true name=description content="Code generation is an experimental feature in Fory Go. The API and behavior may change in future releases. The standard dynamic serialization path remains the stable, recommended approach for most use cases."/><meta data-rh=true property=og:description content="Code generation is an experimental feature in Fory Go. The API and behavior may change in future releases. The standard dynamic serialization path remains the stable, recommended approach for most use cases."/><link data-rh=true rel=icon href=/img/favicon.ico /><link data-rh=true rel=canonical href=https://fory.apache.org/docs/1.2.0/guide/go/codegen /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/1.2.0/guide/go/codegen hreflang=en-US /><link data-rh=true rel=alternate href=https://fory.apache.org/zh-CN/docs/1.2.0/guide/go/codegen hreflang=zh-CN /><link data-rh=true rel=alternate href=https://fory.apache.org/docs/1.2.0/guide/go/codegen hreflang=x-default /><script data-rh=true type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"https://fory.apache.org/docs/1.2.0/guide/go/","name":"Go","position":1},{"@type":"ListItem","item":"https://fory.apache.org/docs/1.2.0/guide/go/codegen","name":"Code Generation","position":2}]}</script><link rel=alternate type=application/rss+xml href=/blog/rss.xml title="Apache Fory™ RSS Feed"><link rel=alternate type=application/atom+xml href=/blog/atom.xml title="Apache Fory™ Atom Feed"><script type=text/javascript>"fury.apache.org"===window.location.host&&(window.location.href="https://fory.apache.org"),function(){for(var o=window.location.pathname,a=["guide","introduction","start"],n=0;n<a.length;n++){var t=a[n],i=RegExp("^((?:/[a-z]{2}-[A-Z]{2})?/docs(?:/(?:next|[0-9]+.[0-9]+))?)/docs/"+t+"(/.*)?$"),c=o.match(i);if(c){var r=c[1]+"/"+t+(c[2]||"");window.location.replace(r+window.location.search+window.location.hash);return}}}()</script><link rel=stylesheet href=/assets/css/styles.3a1edaa1.css /><script src=/assets/js/runtime~main.605b11b1.js defer></script><script src=/assets/js/main.283fea4b.js defer></script></head><body><svg style="display: none;"><defs>
<symbol id=theme-svg-external-link viewBox="0 0 24 24"><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id=__docusaurus><div role=region aria-label="Skip to main content"><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>Skip to main content</a></div><nav aria-label=Main class="theme-layout-navbar navbar navbar--fixed-top"><div class=navbar__inner><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class=navbar__brand href=/><div class=navbar__logo><img src=/img/fory-logo-light.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"/><img src=/img/fory-logo-dark.png alt="Apache Fory™ Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"/></div><b class="navbar__title text--truncate"></b></a><a aria-current=page class="navbar__item navbar__link navbar__link--active" href=/docs/1.2.0/introduction/overview>Docs</a><a class="navbar__item navbar__link" href=/docs/1.2.0/specification/xlang_serialization_spec>Specification</a><a class="navbar__item navbar__link" href=/docs/1.2.0/community/>Community</a><a class="navbar__item navbar__link" href=/user>Users</a><a class="navbar__item navbar__link" href=/download>Download</a><a class="navbar__item navbar__link" href=/blog>Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link>ASF</a><ul class=dropdown__menu><li><a href=https://www.apache.org/ target=_blank rel="noopener noreferrer" class=dropdown__link>Foundation</a><li><a href=https://www.apache.org/licenses/ target=_blank rel="noopener noreferrer" class=dropdown__link>License</a><li><a href=https://www.apache.org/events/current-event.html target=_blank rel="noopener noreferrer" class=dropdown__link>Events</a><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank rel="noopener noreferrer" class=dropdown__link>Privacy</a><li><a href=https://www.apache.org/security/ target=_blank rel="noopener noreferrer" class=dropdown__link>Security</a><li><a href=https://www.apache.org/foundation/sponsorship.html target=_blank rel="noopener noreferrer" class=dropdown__link>Sponsorship</a><li><a href=https://www.apache.org/foundation/thanks.html target=_blank rel="noopener noreferrer" class=dropdown__link>Thanks</a><li><a href=https://www.apache.org/foundation/policies/conduct.html target=_blank rel="noopener noreferrer" class=dropdown__link>Code of Conduct</a></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class=navbar__link aria-haspopup=true aria-expanded=false role=button href=/docs/1.2.0/guide/go/codegen>1.2.0</a><ul class=dropdown__menu><li><a class=dropdown__link href=/docs/next/guide/go/codegen>dev</a><li><a class=dropdown__link href=/docs/guide/go/codegen>1.3.0</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/docs/1.2.0/guide/go/codegen>1.2.0</a><li><a class=dropdown__link href=/docs/1.1.0/guide/go/codegen>1.1.0</a><li><a class=dropdown__link href=/docs/1.0.0/guide/go/codegen>1.0.0</a><li><a class=dropdown__link href=/docs/0.17/guide/go/codegen>0.17</a><li><a class=dropdown__link href=/docs/0.16/guide/go/codegen>0.16</a><li><a class=dropdown__link href=/docs/0.15/guide/go/codegen>0.15</a><li><a class=dropdown__link href=/docs/0.14/introduction/overview>0.14</a><li><a class=dropdown__link href=/docs/0.13/introduction/overview>0.13</a><li><a class=dropdown__link href=/docs/0.12/introduction/overview>0.12</a><li><a class=dropdown__link href=/docs/0.11/introduction/overview>0.11</a><li><a class=dropdown__link href=/docs/0.10/introduction/overview>0.10</a></ul></div><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub repository"></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link><svg viewBox="0 0 24 24" width=20 height=20 aria-hidden=true class=iconLanguage_nlXk><path fill=currentColor d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></svg>English</a><ul class=dropdown__menu><li><a href=/docs/1.2.0/guide/go/codegen target=_self rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=en-US>English</a><li><a href=/zh-CN/docs/1.2.0/guide/go/codegen target=_self rel="noopener noreferrer" class=dropdown__link lang=zh-CN>简体中文</a></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type=button disabled title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill=currentColor d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill=currentColor d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg><svg viewBox="0 0 24 24" width=24 height=24 aria-hidden=true class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill=currentColor d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"/></svg></button></div><div class=navbarSearchContainer_Bca1><div class=navbar__search><span aria-label="expand searchbar" role=button class=search-icon tabindex=0></span><input id=search_input_react type=search placeholder=Loading... aria-label=Search class="navbar__search-input search-bar" disabled/></div></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class=docsWrapper_hBAB><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_njMd><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/1.2.0/introduction/overview><span title=Introduction class=categoryLinkLabel_W154>Introduction</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/introduction/overview><span title=Overview class=linkLabel_WmDU>Overview</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/introduction/features><span title=Features class=linkLabel_WmDU>Features</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/introduction/benchmark><span title=Benchmark class=linkLabel_WmDU>Benchmark</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/docs/1.2.0/start/install><span title=Start class=categoryLinkLabel_W154>Start</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/start/install><span title=Install class=linkLabel_WmDU>Install</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/start/usage><span title=Usage class=linkLabel_WmDU>Usage</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false href=/docs/1.2.0/compiler/><span title="Schema IDL & Compiler" class=categoryLinkLabel_W154>Schema IDL & Compiler</span></a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true href=/docs/1.2.0/guide/java/><span title=Guide class=categoryLinkLabel_W154>Guide</span></a></div><ul class=menu__list><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/java/><span title=Java class=categoryLinkLabel_W154>Java</span></a><button aria-label="Expand sidebar category 'Java'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/python/><span title=Python class=categoryLinkLabel_W154>Python</span></a><button aria-label="Expand sidebar category 'Python'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/rust/><span title=Rust class=categoryLinkLabel_W154>Rust</span></a><button aria-label="Expand sidebar category 'Rust'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/cpp/><span title=C++ class=categoryLinkLabel_W154>C++</span></a><button aria-label="Expand sidebar category 'C++'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--active" tabindex=0 href=/docs/1.2.0/guide/go/><span title=Go class=categoryLinkLabel_W154>Go</span></a><button aria-label="Collapse sidebar category 'Go'" aria-expanded=true type=button class="clean-btn menu__caret"></button></div><ul class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/basic_serialization><span title="Basic Serialization" class=linkLabel_WmDU>Basic Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/xlang_serialization><span title="Xlang Serialization" class=linkLabel_WmDU>Xlang Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/native_serialization><span title="Native Serialization" class=linkLabel_WmDU>Native Serialization</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/configuration><span title=Configuration class=linkLabel_WmDU>Configuration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/schema_metadata><span title="Schema Metadata" class=linkLabel_WmDU>Schema Metadata</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/type_registration><span title="Type Registration" class=linkLabel_WmDU>Type Registration</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/supported_types><span title="Supported Types" class=linkLabel_WmDU>Supported Types</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/references><span title=References class=linkLabel_WmDU>References</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/schema_evolution><span title="Schema Evolution" class=linkLabel_WmDU>Schema Evolution</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/custom_serializers><span title="Custom Serializers" class=linkLabel_WmDU>Custom Serializers</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current=page tabindex=0 href=/docs/1.2.0/guide/go/codegen><span title="Code Generation" class=linkLabel_WmDU>Code Generation</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/thread_safety><span title="Thread Safety" class=linkLabel_WmDU>Thread Safety</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/grpc_support><span title="gRPC Support" class=linkLabel_WmDU>gRPC Support</span></a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link tabindex=0 href=/docs/1.2.0/guide/go/troubleshooting><span title=Troubleshooting class=linkLabel_WmDU>Troubleshooting</span></a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/javascript/><span title=JavaScript class=categoryLinkLabel_W154>JavaScript</span></a><button aria-label="Expand sidebar category 'JavaScript'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/csharp/><span title=C# class=categoryLinkLabel_W154>C#</span></a><button aria-label="Expand sidebar category 'C#'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/swift/><span title=Swift class=categoryLinkLabel_W154>Swift</span></a><button aria-label="Expand sidebar category 'Swift'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/dart/><span title=Dart class=categoryLinkLabel_W154>Dart</span></a><button aria-label="Expand sidebar category 'Dart'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/scala/><span title=Scala class=categoryLinkLabel_W154>Scala</span></a><button aria-label="Expand sidebar category 'Scala'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/kotlin/><span title=Kotlin class=categoryLinkLabel_W154>Kotlin</span></a><button aria-label="Expand sidebar category 'Kotlin'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="categoryLink_byQd menu__link menu__link--sublist" tabindex=0 href=/docs/1.2.0/guide/xlang/><span title="Cross Language" class=categoryLinkLabel_W154>Cross Language</span></a><button aria-label="Expand sidebar category 'Cross Language'" aria-expanded=false type=button class="clean-btn menu__caret"></button></div></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_VOVn"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role=alert><div>This is documentation for <!-- -->Apache Fory™<!-- --> <b>1.2.0</b>, which is no longer actively maintained.</div><div class=margin-top--md>For up-to-date documentation, see the <b><a href=/docs/guide/go/codegen>latest version</a></b> (<!-- -->1.3.0<!-- -->).</div></div><div class=docItemContainer_Djhp><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=Breadcrumbs><ul class=breadcrumbs><li class=breadcrumbs__item><a aria-label="Home page" class=breadcrumbs__link href=/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><span class=breadcrumbs__link>Guide</span><li class=breadcrumbs__item><a class=breadcrumbs__link href=/docs/1.2.0/guide/go/><span>Go</span></a><li class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link>Code Generation</span></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 1.2.0</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type=button class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Code Generation</h1></header><div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class=admonitionHeading_Gvgb><span class=admonitionIcon_Rf37><svg viewBox="0 0 16 16"><path fill-rule=evenodd d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg></span>Experimental Feature</div><div class=admonitionContent_BuS1><p>Code generation is an <strong>experimental</strong> feature in Fory Go. The API and behavior may change in future releases. The standard dynamic serialization path remains the stable, recommended approach for most use cases.</div></div>
<p>Fory Go provides optional ahead-of-time (AOT) code generation for performance-critical paths. This generates dedicated serializers ahead of time and adds compile-time shape checks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=why-code-generation>Why Code Generation?<a href=#why-code-generation class=hash-link aria-label="Direct link to Why Code Generation?" title="Direct link to Why Code Generation?" translate=no></a></h2>
<table><thead><tr><th>Aspect<th>Standard Path<th>Code Generation<tbody><tr><td>Setup<td>Zero configuration<td>Requires <code>go generate</code><tr><td>Performance<td>Excellent<td>Better on hot paths<tr><td>Type Safety<td>Runtime validation<td>Compile-time checks<tr><td>Maintenance<td>Automatic<td>Requires regeneration</table>
<p><strong>Use code generation when</strong>:</p>
<ul>
<li class="">Maximum performance is required</li>
<li class="">Compile-time type safety is important</li>
<li class="">Hot paths are performance-critical</li>
</ul>
<p><strong>Use the standard path when</strong>:</p>
<ul>
<li class="">Simple setup is preferred</li>
<li class="">Types change frequently</li>
<li class="">Dynamic typing is needed</li>
<li class="">Code generation complexity is undesirable</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=installation>Installation<a href=#installation class=hash-link aria-label="Direct link to Installation" title="Direct link to Installation" translate=no></a></h2>
<p>Install the <code>fory</code> generator binary:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">go </span><span class="token function" style=color:#d73a49>install</span><span class="token plain"> github.com/apache/fory/go/fory/cmd/fory@latest</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token assign-left variable" style=color:#36acaa>GO111MODULE</span><span class="token operator" style=color:#393A34>=</span><span class="token plain">on go get </span><span class="token parameter variable" style=color:#36acaa>-u</span><span class="token plain"> github.com/apache/fory/go/fory/cmd/fory</span><br/></div></code></pre></div></div>
<p>Ensure <code>$GOBIN</code> or <code>$GOPATH/bin</code> is in your <code>PATH</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=basic-usage>Basic Usage<a href=#basic-usage class=hash-link aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=step-1-annotate-structs>Step 1: Annotate Structs<a href=#step-1-annotate-structs class=hash-link aria-label="Direct link to Step 1: Annotate Structs" title="Direct link to Step 1: Annotate Structs" translate=no></a></h3>
<p>Add the <code>//fory:generate</code> comment above structs:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> models</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> User </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> ID </span><span class="token builtin">int64</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>`json:"id"`</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>`json:"name"`</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> Order </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> ID </span><span class="token builtin">int64</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Customer </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Total </span><span class="token builtin">float64</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=step-2-add-go-generate-directive>Step 2: Add Go Generate Directive<a href=#step-2-add-go-generate-directive class=hash-link aria-label="Direct link to Step 2: Add Go Generate Directive" title="Direct link to Step 2: Add Go Generate Directive" translate=no></a></h3>
<p>Add a <code>go:generate</code> directive (once per file or package):</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>//go:generate fory -file models.go</span><br/></div></code></pre></div></div>
<p>Or for the entire package:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>//go:generate fory -pkg .</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=step-3-run-code-generation>Step 3: Run Code Generation<a href=#step-3-run-code-generation class=hash-link aria-label="Direct link to Step 3: Run Code Generation" title="Direct link to Step 3: Run Code Generation" translate=no></a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">go generate ./</span><span class="token punctuation" style=color:#393A34>..</span><span class="token plain">.</span><br/></div></code></pre></div></div>
<p>This creates <code>models_fory_gen.go</code> with generated serializers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=generated-code-structure>Generated Code Structure<a href=#generated-code-structure class=hash-link aria-label="Direct link to Generated Code Structure" title="Direct link to Generated Code Structure" translate=no></a></h2>
<p>The generator creates:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=type-snapshot>Type Snapshot<a href=#type-snapshot class=hash-link aria-label="Direct link to Type Snapshot" title="Direct link to Type Snapshot" translate=no></a></h3>
<p>A compile-time check to detect struct changes:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// Snapshot of User's underlying type at generation time</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> _User_expected </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> ID </span><span class="token builtin">int64</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Compile-time check: fails if User no longer matches</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>var</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>_</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>func</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">x User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>_</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>_User_expected</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">x</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=serializer-implementation>Serializer Implementation<a href=#serializer-implementation class=hash-link aria-label="Direct link to Serializer Implementation" title="Direct link to Serializer Implementation" translate=no></a></h3>
<p>Strongly-typed serialization methods:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> User_ForyGenSerializer </span><span class="token keyword" style=color:#00009f>struct</span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>func</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>NewSerializerFor_User</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">Serializer </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>&</span><span class="token plain">User_ForyGenSerializer</span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>func</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">User_ForyGenSerializer</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>WriteTyped</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">ctx </span><span class="token operator" style=color:#393A34>*</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">WriteContext</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> v </span><span class="token operator" style=color:#393A34>*</span><span class="token plain">User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> buf </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Buffer</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> buf</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>WriteInt64</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">v</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ID</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>WriteString</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">v</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">Name</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>nil</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>func</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">User_ForyGenSerializer</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>ReadTyped</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">ctx </span><span class="token operator" style=color:#393A34>*</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ReadContext</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> v </span><span class="token operator" style=color:#393A34>*</span><span class="token plain">User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> err </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Err</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> buf </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Buffer</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> v</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">ID </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> buf</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>ReadInt64</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">err</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> v</span><span class="token punctuation" style=color:#393A34>.</span><span class="token plain">Name </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>ReadString</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>if</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>HasError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> ctx</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>TakeError</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token keyword" style=color:#00009f>return</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>nil</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=auto-registration>Auto-Registration<a href=#auto-registration class=hash-link aria-label="Direct link to Auto-Registration" title="Direct link to Auto-Registration" translate=no></a></h3>
<p>Serializers are registered in <code>init()</code>:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>func</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>init</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>RegisterSerializerFactory</span><span class="token punctuation" style=color:#393A34>(</span><span class="token punctuation" style=color:#393A34>(</span><span class="token operator" style=color:#393A34>*</span><span class="token plain">User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>(</span><span class="token boolean" style=color:#36acaa>nil</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> NewSerializerFor_User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=command-line-options>Command-Line Options<a href=#command-line-options class=hash-link aria-label="Direct link to Command-Line Options" title="Direct link to Command-Line Options" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=file-based-generation>File-Based Generation<a href=#file-based-generation class=hash-link aria-label="Direct link to File-Based Generation" title="Direct link to File-Based Generation" translate=no></a></h3>
<p>Generate for a specific file:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">fory </span><span class="token parameter variable" style=color:#36acaa>-file</span><span class="token plain"> models.go</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=package-based-generation>Package-Based Generation<a href=#package-based-generation class=hash-link aria-label="Direct link to Package-Based Generation" title="Direct link to Package-Based Generation" translate=no></a></h3>
<p>Generate for a package:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">fory </span><span class="token parameter variable" style=color:#36acaa>-pkg</span><span class="token plain"> ./models</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=explicit-types>Explicit Types<a href=#explicit-types class=hash-link aria-label="Direct link to Explicit Types" title="Direct link to Explicit Types" translate=no></a></h3>
<p>Specify types explicitly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">fory </span><span class="token parameter variable" style=color:#36acaa>-pkg</span><span class="token plain"> ./models </span><span class="token parameter variable" style=color:#36acaa>-type</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"User,Order"</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=force-regeneration>Force Regeneration<a href=#force-regeneration class=hash-link aria-label="Direct link to Force Regeneration" title="Direct link to Force Regeneration" translate=no></a></h3>
<p>Force regeneration even if up-to-date:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">fory </span><span class="token parameter variable" style=color:#36acaa>--force</span><span class="token plain"> </span><span class="token parameter variable" style=color:#36acaa>-file</span><span class="token plain"> models.go</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=when-to-regenerate>When to Regenerate<a href=#when-to-regenerate class=hash-link aria-label="Direct link to When to Regenerate" title="Direct link to When to Regenerate" translate=no></a></h2>
<p>Regenerate when any of these change:</p>
<ul>
<li class="">Field additions, removals, or renames</li>
<li class="">Field type changes</li>
<li class="">Struct tag changes</li>
<li class="">New structs with <code>//fory:generate</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=automatic-detection>Automatic Detection<a href=#automatic-detection class=hash-link aria-label="Direct link to Automatic Detection" title="Direct link to Automatic Detection" translate=no></a></h3>
<p>Fory includes a compile-time guard:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// If struct changed, this fails to compile</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>var</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>_</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token keyword" style=color:#00009f>func</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">x User</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>_</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>=</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>_User_expected</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">x</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<p>If you forget to regenerate, the build fails with a clear message.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=auto-retry>Auto-Retry<a href=#auto-retry class=hash-link aria-label="Direct link to Auto-Retry" title="Direct link to Auto-Retry" translate=no></a></h3>
<p>When invoked via <code>go generate</code>, the generator detects stale code and retries:</p>
<ol>
<li class="">Detects compile error from guard</li>
<li class="">Removes stale generated file</li>
<li class="">Regenerates fresh code</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=supported-types>Supported Types<a href=#supported-types class=hash-link aria-label="Direct link to Supported Types" title="Direct link to Supported Types" translate=no></a></h2>
<p>Code generation supports:</p>
<ul>
<li class="">All primitive types (<code>bool</code>, <code>int*</code>, <code>uint*</code>, <code>float*</code>, <code>string</code>)</li>
<li class="">Slices of primitives and structs</li>
<li class="">Maps with supported key/value types</li>
<li class="">Nested structs (must also be generated)</li>
<li class="">Pointers to structs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=nested-structs>Nested Structs<a href=#nested-structs class=hash-link aria-label="Direct link to Nested Structs" title="Direct link to Nested Structs" translate=no></a></h3>
<p>All nested structs must also have <code>//fory:generate</code>:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> Address </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> City </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Country </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> Person </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Address Address </span><span class="token comment" style=color:#999988;font-style:italic>// Address must also be generated</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=cicd-integration>CI/CD Integration<a href=#cicd-integration class=hash-link aria-label="Direct link to CI/CD Integration" title="Direct link to CI/CD Integration" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=check-in-generated-code>Check In Generated Code<a href=#check-in-generated-code class=hash-link aria-label="Direct link to Check In Generated Code" title="Direct link to Check In Generated Code" translate=no></a></h3>
<p><strong>Recommended for libraries</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">go generate ./</span><span class="token punctuation" style=color:#393A34>..</span><span class="token plain">.</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token function" style=color:#d73a49>git</span><span class="token plain"> </span><span class="token function" style=color:#d73a49>add</span><span class="token plain"> *_fory_gen.go</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token function" style=color:#d73a49>git</span><span class="token plain"> commit </span><span class="token parameter variable" style=color:#36acaa>-m</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Regenerate Fory serializers"</span><br/></div></code></pre></div></div>
<p><strong>Pros</strong>: Consumers can build without generator; reproducible builds
<strong>Cons</strong>: Larger diffs; must remember to regenerate</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=generate-in-pipeline>Generate in Pipeline<a href=#generate-in-pipeline class=hash-link aria-label="Direct link to Generate in Pipeline" title="Direct link to Generate in Pipeline" translate=no></a></h3>
<p><strong>Recommended for applications</strong>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token key atrule" style=color:#00a4db>steps</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>-</span><span class="token plain"> </span><span class="token key atrule" style=color:#00a4db>run</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> go install github.com/apache/fory/go/fory/cmd/fory@latest</span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>-</span><span class="token plain"> </span><span class="token key atrule" style=color:#00a4db>run</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> go generate ./</span><span class="token punctuation" style=color:#393A34>...</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>-</span><span class="token plain"> </span><span class="token key atrule" style=color:#00a4db>run</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> go build ./</span><span class="token punctuation" style=color:#393A34>...</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=usage-with-generated-code>Usage with Generated Code<a href=#usage-with-generated-code class=hash-link aria-label="Direct link to Usage with Generated Code" title="Direct link to Usage with Generated Code" translate=no></a></h2>
<p>Generated code integrates transparently:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">f </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>New</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">fory</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>WithXlang</span><span class="token punctuation" style=color:#393A34>(</span><span class="token boolean" style=color:#36acaa>true</span><span class="token punctuation" style=color:#393A34>)</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>// Fory automatically uses generated serializer if available</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">user </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>&</span><span class="token plain">User</span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain">ID</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token number" style=color:#36acaa>1</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> Name</span><span class="token punctuation" style=color:#393A34>:</span><span class="token plain"> </span><span class="token string" style=color:#e3116c>"Alice"</span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token boolean" style=color:#36acaa>_</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>:=</span><span class="token plain"> f</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Serialize</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">user</span><span class="token punctuation" style=color:#393A34>)</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>var</span><span class="token plain"> result User</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">f</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Deserialize</span><span class="token punctuation" style=color:#393A34>(</span><span class="token plain">data</span><span class="token punctuation" style=color:#393A34>,</span><span class="token plain"> </span><span class="token operator" style=color:#393A34>&</span><span class="token plain">result</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<p>No code changes needed - registration happens in <code>init()</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=mixing-generated-and-non-generated>Mixing Generated and Non-Generated<a href=#mixing-generated-and-non-generated class=hash-link aria-label="Direct link to Mixing Generated and Non-Generated" title="Direct link to Mixing Generated and Non-Generated" translate=no></a></h2>
<p>You can mix approaches:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> HotPathStruct </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic>// Performance-critical, use codegen</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> ColdPathStruct </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> </span><span class="token comment" style=color:#999988;font-style:italic>// Not annotated, uses the standard dynamic serializer</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=limitations>Limitations<a href=#limitations class=hash-link aria-label="Direct link to Limitations" title="Direct link to Limitations" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=experimental-status>Experimental Status<a href=#experimental-status class=hash-link aria-label="Direct link to Experimental Status" title="Direct link to Experimental Status" translate=no></a></h3>
<ul>
<li class="">API may change</li>
<li class="">Not all edge cases tested</li>
<li class="">May have undiscovered bugs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=not-supported>Not Supported<a href=#not-supported class=hash-link aria-label="Direct link to Not Supported" title="Direct link to Not Supported" translate=no></a></h3>
<ul>
<li class="">Interface fields (dynamic types)</li>
<li class="">Recursive types without pointers</li>
<li class="">Private (unexported) fields</li>
<li class="">Custom serializers</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=standard-path-fallback>Standard Path Fallback<a href=#standard-path-fallback class=hash-link aria-label="Direct link to Standard Path Fallback" title="Direct link to Standard Path Fallback" translate=no></a></h3>
<p>If generated serializers are unavailable, Fory falls back to the standard serializer path:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token comment" style=color:#999988;font-style:italic>// If User_ForyGenSerializer is not linked in, Fory uses the standard path</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain">f</span><span class="token punctuation" style=color:#393A34>.</span><span class="token function" style=color:#d73a49>Serialize</span><span class="token punctuation" style=color:#393A34>(</span><span class="token operator" style=color:#393A34>&</span><span class="token plain">User</span><span class="token punctuation" style=color:#393A34>{</span><span class="token punctuation" style=color:#393A34>}</span><span class="token punctuation" style=color:#393A34>)</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=troubleshooting>Troubleshooting<a href=#troubleshooting class=hash-link aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=fory-command-not-found>"fory: command not found"<a href=#fory-command-not-found class=hash-link aria-label='Direct link to "fory: command not found"' title='Direct link to "fory: command not found"' translate=no></a></h3>
<p>Ensure the binary is in PATH:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable environment constant" style=color:#36acaa>PATH</span><span class="token operator" style=color:#393A34>=</span><span class="token environment constant" style=color:#36acaa>$PATH</span><span class="token builtin class-name">:</span><span class="token variable" style=color:#36acaa>$(</span><span class="token variable" style=color:#36acaa>go </span><span class="token variable function" style=color:#d73a49>env</span><span class="token variable" style=color:#36acaa> GOPATH</span><span class="token variable" style=color:#36acaa>)</span><span class="token plain">/bin</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=compile-error-after-struct-change>Compile Error After Struct Change<a href=#compile-error-after-struct-change class=hash-link aria-label="Direct link to Compile Error After Struct Change" title="Direct link to Compile Error After Struct Change" translate=no></a></h3>
<p>Regenerate:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">go generate ./</span><span class="token punctuation" style=color:#393A34>..</span><span class="token plain">.</span><br/></div></code></pre></div></div>
<p>Or force:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">fory </span><span class="token parameter variable" style=color:#36acaa>--force</span><span class="token plain"> </span><span class="token parameter variable" style=color:#36acaa>-file</span><span class="token plain"> yourfile.go</span><br/></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=generated-code-out-of-sync>Generated Code Out of Sync<a href=#generated-code-out-of-sync class=hash-link aria-label="Direct link to Generated Code Out of Sync" title="Direct link to Generated Code Out of Sync" translate=no></a></h3>
<p>The compile-time guard catches this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">cannot use x (variable of type User) as type _User_expected in argument</span><br/></div></code></pre></div></div>
<p>Run <code>go generate</code> to fix.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=example-project-structure>Example Project Structure<a href=#example-project-structure class=hash-link aria-label="Direct link to Example Project Structure" title="Direct link to Example Project Structure" translate=no></a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-text codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token plain">myproject/</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">├── models/</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ ├── models.go # Struct definitions</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ ├── models_fory_gen.go # Generated code</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">│ └── generate.go # go:generate directive</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">├── main.go</span><br/></div><div class=token-line style=color:#393A34><span class="token plain">└── go.mod</span><br/></div></code></pre></div></div>
<p><strong>models/generate.go</strong>:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> models</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>//go:generate fory -pkg .</span><br/></div></code></pre></div></div>
<p><strong>models/models.go</strong>:</p>
<div class="language-go codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#393A34;--prism-background-color:#f6f8fa><div class=codeBlockContent_QJqH><pre tabindex=0 class="prism-code language-go codeBlock_bY9V thin-scrollbar" style=color:#393A34;background-color:#f6f8fa><code class=codeBlockLines_e6Vv><div class=token-line style=color:#393A34><span class="token keyword" style=color:#00009f>package</span><span class="token plain"> models</span><br/></div><div class=token-line style=color:#393A34><span class="token plain" style=display:inline-block></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token comment" style=color:#999988;font-style:italic>//fory:generate</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token keyword" style=color:#00009f>type</span><span class="token plain"> User </span><span class="token keyword" style=color:#00009f>struct</span><span class="token plain"> </span><span class="token punctuation" style=color:#393A34>{</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> ID </span><span class="token builtin">int64</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"></span><br/></div><div class=token-line style=color:#393A34><span class="token plain"></span><span class="token punctuation" style=color:#393A34>}</span><br/></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=faq>FAQ<a href=#faq class=hash-link aria-label="Direct link to FAQ" title="Direct link to FAQ" translate=no></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=is-codegen-required>Is codegen required?<a href=#is-codegen-required class=hash-link aria-label="Direct link to Is codegen required?" title="Direct link to Is codegen required?" translate=no></a></h3>
<p>No. The standard serializer path works without code generation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=does-generated-code-work-across-go-versions>Does generated code work across Go versions?<a href=#does-generated-code-work-across-go-versions class=hash-link aria-label="Direct link to Does generated code work across Go versions?" title="Direct link to Does generated code work across Go versions?" translate=no></a></h3>
<p>Yes. Generated code is plain Go with no version-specific features.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=can-i-mix-generated-and-non-generated-types>Can I mix generated and non-generated types?<a href=#can-i-mix-generated-and-non-generated-types class=hash-link aria-label="Direct link to Can I mix generated and non-generated types?" title="Direct link to Can I mix generated and non-generated types?" translate=no></a></h3>
<p>Yes. Fory automatically uses generated serializers when available.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=how-do-i-update-generated-code>How do I update generated code?<a href=#how-do-i-update-generated-code class=hash-link aria-label="Direct link to How do I update generated code?" title="Direct link to How do I update generated code?" translate=no></a></h3>
<p>Run <code>go generate ./...</code> after struct changes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id=should-i-commit-generated-files>Should I commit generated files?<a href=#should-i-commit-generated-files class=hash-link aria-label="Direct link to Should I commit generated files?" title="Direct link to Should I commit generated files?" translate=no></a></h3>
<p>For libraries: yes. For applications: either works.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id=related-topics>Related Topics<a href=#related-topics class=hash-link aria-label="Direct link to Related Topics" title="Direct link to Related Topics" translate=no></a></h2>
<ul>
<li class=""><a class="" href=/docs/1.2.0/guide/go/basic_serialization>Basic Serialization</a></li>
<li class=""><a class="" href=/docs/1.2.0/guide/go/configuration>Configuration</a></li>
<li class=""><a class="" href=/docs/1.2.0/guide/go/troubleshooting>Troubleshooting</a></li>
</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href=https://github.com/apache/fory-site/tree/main/docs/guide/go/codegen.md target=_blank rel="noopener noreferrer" class=theme-edit-this-page><svg fill=currentColor height=20 width=20 viewBox="0 0 40 40" class=iconEdit_Z9Sw aria-hidden=true><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"/></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href=/docs/1.2.0/guide/go/custom_serializers><div class=pagination-nav__sublabel>Previous</div><div class=pagination-nav__label>Custom Serializers</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/docs/1.2.0/guide/go/thread_safety><div class=pagination-nav__sublabel>Next</div><div class=pagination-nav__label>Thread Safety</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href=#why-code-generation class="table-of-contents__link toc-highlight">Why Code Generation?</a><li><a href=#installation class="table-of-contents__link toc-highlight">Installation</a><li><a href=#basic-usage class="table-of-contents__link toc-highlight">Basic Usage</a><ul><li><a href=#step-1-annotate-structs class="table-of-contents__link toc-highlight">Step 1: Annotate Structs</a><li><a href=#step-2-add-go-generate-directive class="table-of-contents__link toc-highlight">Step 2: Add Go Generate Directive</a><li><a href=#step-3-run-code-generation class="table-of-contents__link toc-highlight">Step 3: Run Code Generation</a></ul><li><a href=#generated-code-structure class="table-of-contents__link toc-highlight">Generated Code Structure</a><ul><li><a href=#type-snapshot class="table-of-contents__link toc-highlight">Type Snapshot</a><li><a href=#serializer-implementation class="table-of-contents__link toc-highlight">Serializer Implementation</a><li><a href=#auto-registration class="table-of-contents__link toc-highlight">Auto-Registration</a></ul><li><a href=#command-line-options class="table-of-contents__link toc-highlight">Command-Line Options</a><ul><li><a href=#file-based-generation class="table-of-contents__link toc-highlight">File-Based Generation</a><li><a href=#package-based-generation class="table-of-contents__link toc-highlight">Package-Based Generation</a><li><a href=#explicit-types class="table-of-contents__link toc-highlight">Explicit Types</a><li><a href=#force-regeneration class="table-of-contents__link toc-highlight">Force Regeneration</a></ul><li><a href=#when-to-regenerate class="table-of-contents__link toc-highlight">When to Regenerate</a><ul><li><a href=#automatic-detection class="table-of-contents__link toc-highlight">Automatic Detection</a><li><a href=#auto-retry class="table-of-contents__link toc-highlight">Auto-Retry</a></ul><li><a href=#supported-types class="table-of-contents__link toc-highlight">Supported Types</a><ul><li><a href=#nested-structs class="table-of-contents__link toc-highlight">Nested Structs</a></ul><li><a href=#cicd-integration class="table-of-contents__link toc-highlight">CI/CD Integration</a><ul><li><a href=#check-in-generated-code class="table-of-contents__link toc-highlight">Check In Generated Code</a><li><a href=#generate-in-pipeline class="table-of-contents__link toc-highlight">Generate in Pipeline</a></ul><li><a href=#usage-with-generated-code class="table-of-contents__link toc-highlight">Usage with Generated Code</a><li><a href=#mixing-generated-and-non-generated class="table-of-contents__link toc-highlight">Mixing Generated and Non-Generated</a><li><a href=#limitations class="table-of-contents__link toc-highlight">Limitations</a><ul><li><a href=#experimental-status class="table-of-contents__link toc-highlight">Experimental Status</a><li><a href=#not-supported class="table-of-contents__link toc-highlight">Not Supported</a><li><a href=#standard-path-fallback class="table-of-contents__link toc-highlight">Standard Path Fallback</a></ul><li><a href=#troubleshooting class="table-of-contents__link toc-highlight">Troubleshooting</a><ul><li><a href=#fory-command-not-found class="table-of-contents__link toc-highlight">"fory: command not found"</a><li><a href=#compile-error-after-struct-change class="table-of-contents__link toc-highlight">Compile Error After Struct Change</a><li><a href=#generated-code-out-of-sync class="table-of-contents__link toc-highlight">Generated Code Out of Sync</a></ul><li><a href=#example-project-structure class="table-of-contents__link toc-highlight">Example Project Structure</a><li><a href=#faq class="table-of-contents__link toc-highlight">FAQ</a><ul><li><a href=#is-codegen-required class="table-of-contents__link toc-highlight">Is codegen required?</a><li><a href=#does-generated-code-work-across-go-versions class="table-of-contents__link toc-highlight">Does generated code work across Go versions?</a><li><a href=#can-i-mix-generated-and-non-generated-types class="table-of-contents__link toc-highlight">Can I mix generated and non-generated types?</a><li><a href=#how-do-i-update-generated-code class="table-of-contents__link toc-highlight">How do I update generated code?</a><li><a href=#should-i-commit-generated-files class="table-of-contents__link toc-highlight">Should I commit generated files?</a></ul><li><a href=#related-topics class="table-of-contents__link toc-highlight">Related Topics</a></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://lists.apache.org/list.html?dev@fory.apache.org target=_blank rel="noopener noreferrer" class=footer__link-item>Mailing list<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://join.slack.com/t/fory-project/shared_invite/zt-1u8soj4qc-ieYEu7ciHOqA2mo47llS8A target=_blank rel="noopener noreferrer" class=footer__link-item>Slack<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://twitter.com/ApacheFory target=_blank rel="noopener noreferrer" class=footer__link-item>Twitter<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Docs</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/docs/start/install>Install</a><li class=footer__item><a class=footer__link-item href=/docs/start/usage>Usage</a><li class=footer__item><a class=footer__link-item href=/docs/introduction/benchmark>Benchmark</a></ul></div><div class="theme-layout-footer-column col footer__col"><div class=footer__title>Repositories</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://github.com/apache/fory target=_blank rel="noopener noreferrer" class=footer__link-item>Apache Fory™<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a><li class=footer__item><a href=https://github.com/apache/fory-site target=_blank rel="noopener noreferrer" class=footer__link-item>Website<svg width=13.5 height=13.5 aria-label="(opens in new tab)" class=iconExternalLink_nPIU><use href=#theme-svg-external-link /></svg></a></ul></div></div><div class="footer__bottom text--center"><div class=margin-bottom--sm><a href=https://apache.org/ rel="noopener noreferrer" class=footerLogoLink_BH7S><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width=200 /><img src=/img/asf_logo.svg alt="ASF Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width=200 /></a></div><div class=footer__copyright><div>
<p>
Copyright © 2026 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br/>
Apache Fory, Fory, Apache, the Apache Logo and the Apache Fory logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.
</p>
</div></div></div></div></footer></div></body>